【问题标题】:C# Threads Handling eventC# 线程处理事件
【发布时间】:2012-10-07 06:06:11
【问题描述】:

我试图让线程也处理 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);
}

【问题讨论】:

  • 代码太多了,能不能去掉一些没必要的代码,让它更易读?
  • 删除了很多希望能帮助更多的东西。

标签: c# multithreading events event-handling


【解决方案1】:

不幸的是,事件并非如此。处理程序始终由引发事件的线程执行,而不是由订阅事件的线程执行。

【讨论】:

  • 那么还有其他方法吗?原因是任务要求当零售商收到新销售正在进行的通知时,他们将订购。但是订单需要有一个零售商编号。在我们的例子中,零售商 # 将是线程的 ID。但是如果是被养鸡场执行,线程 ID 将不等于零售商线程。
  • @user1726225:实际上,当另一个线程引发事件时,您会尝试在单独的线程上执行方法。在我看来,唯一的方法是合作,即等待事件的线程需要在其代码中的某个时刻自愿等待事件发出信号,然后执行所需的代码。
  • 这帮了大忙。谢谢都铎。我现在开始工作了。通过让它等待它为真,然后用标志警告。谢谢大佬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多