4

我认为这里有点有趣。我有一个类负责将多个处理操作“多路复用”到固定数量的线程上。典型的情况是一种生产者/消费者问题,其中每个操作都包含一个 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 waitHandles
E = Combine(A, B)
F = Combine(C, D)
waitHandles = { E, F }

while(true)
{
   int index = WaitHandle.WaitAny(waitHandles);
   if(index == 0)
   {
   }
   else
   {
   }
}

加分?

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

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

谢谢你的帮助

4

1 回答 1

1

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

于 2010-12-31T20:22:58.300 回答