c# – 组合等待手柄?

c# – 组合等待手柄?,第1张

概述我觉得这里有点有趣.我有一个类负责将多个处理 *** 作“多路复用”到固定数量的线程上.典型的情况是一种生产者/消费者问题,其中每个 *** 作都包含一个WaitHandle(在这种情况下,跟踪队列中有多少项的信号量)和一个要调用的委托. 例如,如果我有两个生产者(A和B),则将项目生成两个单独的队列.我没有为每个生产者创建两个消费者线程(A1,A2,B1,B2),而是将四个消费者“线程”复用到两个线程上.这个“ 我觉得这里有点有趣.我有一个类负责将多个处理 *** 作“多路复用”到固定数量的线程上.典型的情况是一种生产者/消费者问题,其中每个 *** 作都包含一个WaitHandle(在这种情况下,跟踪队列中有多少项的信号量)和一个要调用的委托.

例如,如果我有两个生产者(A和B),则将项目生成两个单独的队列.我没有为每个生产者创建两个消费者线程(A1,A2,B1,B2),而是将四个消费者“线程”复用到两个线程上.这个“多路复用器”的代码运行类似这样(简化了一点):

WaitHandle[] waitHandles = new WaitHandle[2];waitHandles[0] = NumberOfItemsFullinProducerAQueue;waitHandles[1] = NumberOfItemsFullinProducerBQueue;while(true){    int index = WaitHandle.WaitAny(waitHandles);    if(index == 0)    {        // handle the item from queue A    }    else    {        // handle the item from queue B    }}

我试图将这个概念扩展到一个稍微复杂的例子,其中一个动作可能需要在执行之前满足多个等待句柄.我想知道是否有某种WaitHandle.Combine(waitHandle1,waitHandle2)调用我可以将两个等待句柄组合成一个等待句柄.最终结果将是这样的:

A,B,C,D are waitHandlesE = Combine(A,B)F = Combine(C,D)waitHandles = { E,F }while(true){   int index = WaitHandle.WaitAny(waitHandles);   if(index == 0)   {   }   else   {   }}

加分?

虽然不是必需的,但如果等待句柄的组合可以相交,那么它也可能非常好.例如,像这样:

A,C are waitHandles  D = Combine(A,B)  E = Combine(A,C)  waitHandles = { D,E }  // same as above from here

谢谢你的帮助

解决方法 您可以考虑在.NET 4 TPL中查看新的 Barrier类(作为 Reactive Extensions的一部分反向移植到3.5).它专门针对您描述的场景而设计,您需要阻止执行,直到多个协作任务到达检查点.您还可以使用任务系统创建复杂的延续路径,其中一个任务取决于先前完成的两个,取决于第一个任务完成,如果在任何时候发生异常,则在中心位置聚合和报告这些异常. 总结

以上是内存溢出为你收集整理的c# – 组合等待手柄?全部内容,希望文章能够帮你解决c# – 组合等待手柄?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1227756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存