我試圖讓線程也處理pricecutEvent,但我無法獲得線程訂閱priceCutEvent。所以它不是由每個線程處理。我這樣做的原因是當priceCutEvent發生時,線程應該「購買」更多的雞。但是,它只是由普通的「chickenStore」處理,而不是由5個線程處理。我該怎麼做才能讓線程真正處理事件? 我試過了:C#線程處理事件
ChickenFarm.priceCut += new priceCutEvent(reatilers[i].chickenOnSale);
但這不起作用。爲你刪除了很多。
public delegate void priceCutEvent(Int32 pr); //define a delegate
public delegate void orderEvent();
public static void changePrice(Int32 price)
{
if (price < chickenPrice) //a price cut occured
{
if (priceCut != null) //there is at least one subscriber
priceCut(price); //emit event to subscriber
}
chickenPrice = price;
}
public class myApplication
{
static void Main(string[] args)
{
ChickenFarm chicken = new ChickenFarm();
multiCellBuffer thisBuffer = new multiCellBuffer();
/*Alternatively we could use this instead of a regular expression:
ThreadStart starter = delegate{chicken.farmerFunc(thisBuffer);};
Thread farmer = new Thread(starter);
farmer.start(); */
Thread farmer = new Thread(() => chicken.farmerFunc(thisBuffer));
farmer.Start(); // Start one farmer thread
Retailer chickenstore = new Retailer();
Retailer.orderInNeedOfProcessing += new orderEvent(chicken.processOrder);
Thread[] retailers = new Thread[5];
ChickenFarm.priceCut += new priceCutEvent(chickenstore.chickenOnSale);
for (int i = 0; i < 5; i++) // Start N retailer threads
{
//Thread thread = new Thread(() => ReadCentralOutQueue("test"));
retailers[i] = new Thread(() => chickenstore.retailerFunc(thisBuffer, chicken));
retailers[i].Name = (i + 1).ToString();
retailers[i].Start();
}
}
}
public void chickenOnSale(Int32 p) // Event handler
{
// order chickens from chicken farm - send order into queue
OrderObject myOrder = new OrderObject();
myOrder.setID(Thread.CurrentThread.Name);
Console.WriteLine("Order ID: {0}", Thread.CurrentThread.Name);
Int64 myRandomCardNo = rng.Next(1000000000);
Int32 myRandomAmount = rng.Next(0, 100);
myOrder.setCardNo(myRandomCardNo);
myOrder.setAmount(myRandomAmount);
String myOrderString = encoder(myOrder);
Console.WriteLine("Un-Encrypted Order: {0}", myOrder.toString());
Console.WriteLine("Encrypted Order: {0}", myOrderString);
sendOrder(myBuffer, myOrderString);
Console.WriteLine("Store {0} chickens are on sale: as low as ${1} each",
Thread.CurrentThread.Name, p);
}
太多的代碼,你能擺脫一些不必要的代碼,使其更具可讀性嗎? –
刪除了很多希望,幫助更多。 – user1726225