2012-10-07 189 views
1

我試圖讓線程也處理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); 
} 
+0

太多的代碼,你能擺脫一些不必要的代碼,使其更具可讀性嗎? –

+0

刪除了很多希望,幫助更多。 – user1726225

回答

0

不幸的是,事件並非如此。處理程序總是由引發事件的線程執行,而不是線程訂閱事件。

+0

有沒有其他的方式來做到這一點呢?原因在於轉讓要求零售商收到新的銷售正在進行的通知時,他們會下單。但訂單需要有零售商編號。我們案例中的零售商#將是線索的ID。但是,如果雞羣正在執行線程ID,它將不等於零售商線程。 – user1726225

+0

@ user1726225:實際上,當另一個線程引發一個事件時,您試圖在單獨的線程上執行一個方法。我看到它的唯一方法就是通過合作,即等待事件的線程需要自動等待代碼中的某個時刻發送事件信號,然後執行所需的代碼。 – Tudor

+0

這幫了很多。感謝都鐸王朝。我現在開始工作了。通過讓它等待它是真實的,然後用標誌提醒。謝啦。 – user1726225