簡體   English   中英

C#線程處理事件

[英]C# Threads Handling event

我正在嘗試讓線程也處理pricecutEvent,但是我無法讓線程訂閱priceCutEvent。 因此,它不是由每個線程處理的。 我這樣做的原因是當priceCutEvent發生時,線程應該“購買”更多的雞。 但是,它僅由常規的“ chickenStore”處理,而不是由5個線程處理。 我如何做到這一點,以便線程實際上在處理事件? 我試過了:

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);
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM