Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程处理事件_C#_Multithreading_Events_Event Handling - Fatal编程技术网

C#线程处理事件

C#线程处理事件,c#,multithreading,events,event-handling,C#,Multithreading,Events,Event Handling,我试图让线程也处理pricecutEvent,但我无法让线程订阅pricecutEvent。因此它不是由每个线程处理的。我这样做的原因是当priceCutEvent发生时,线程应该“购买”更多的鸡。但是它只是由常规的“chickenStore”处理,而不是由5个线程处理。如何使线程实际处理事件? 我试过: ChickenFarm.priceCut += new priceCutEvent(reatilers[i].chickenOnSale); 但这是行不通的。为你移除了很多 public

我试图让线程也处理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);
}
public delegate void priceCutEvent(Int32 pr)//定义委托
公共委托void orderEvent();
公共静态无效更改价格(Int32价格)
{
if(pricechicken.farmerFunc(thisBuffer));
farmer.Start();//启动一个farmer线程
零售商chickenstore=新零售商();
Retailer.orderInNeedOfProcessing+=新订单事件(chicken.processOrder);
线程[]=新线程[5];
ChickenFarm.priceCut+=新的priceCutEvent(chickenstore.chickenOnSale);
对于(int i=0;i<5;i++)//启动N个零售商线程
{
//线程线程=新线程(()=>ReadCentralOutQueue(“测试”);
零售商[i]=新线程(()=>chickenstore.retailerFunc(thisBuffer,chicken));
零售商[i].Name=(i+1).ToString();
零售商[i].Start();
}
}
}
public void chickenOnSale(Int32 p)//事件处理程序
{
//从鸡场订购鸡肉-将订单发送到队列中
OrderObject myOrder=新的OrderObject();
myOrder.setID(Thread.CurrentThread.Name);
WriteLine(“订单ID:{0}”,Thread.CurrentThread.Name);
Int64 myRandomCardNo=rng.Next(100000000);
Int32 myRandomAmount=rng.Next(0,100);
myOrder.setCardNo(myRandomCardNo);
myOrder.setAmount(myRandomAmount);
字符串myOrderString=编码器(myOrder);
WriteLine(“未加密的顺序:{0}”,myOrder.toString());
WriteLine(“加密顺序:{0}”,myOrderString);
sendOrder(myBuffer、myOrderString);
WriteLine(“商店出售{0}只鸡:每只低至${1}”,
Thread.CurrentThread.Name,p);
}

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

代码太多,您能否去掉一些不必要的代码以使其更具可读性?删除了很多,希望这会有帮助。那么还有其他方法吗?原因是当零售商收到新的销售正在进行的通知时,他们将进行订购。但订单需要有零售商编号。零售商#在我们的例子中是线程的ID。但是如果它是由chickenfarm执行的,那么线程ID将不等于零售商线程。@user1726225:实际上,当另一个线程引发事件时,您试图在一个单独的线程上执行一个方法。在我看来,唯一的方法是通过合作,即等待事件的线程需要在代码中的某个点自愿等待事件被通知,然后执行所需的代码。这帮了大忙。谢谢都铎。我现在开始工作了。让它等待它为真,然后用标志发出警报。谢谢你,伙计。