如何确定所有线程何时完成执行?

时间:2011-08-12 16:25:52

标签: c# multithreading .net-3.5 concurrency notifications

我有一个架构,它从打包的二进制文件中读取数据包,根据数据包类型将每个数据包分配给一个单独的处理管道,然后将数据包重新组装到管道另一端的新文件中。每个管道都包含类似于this one.

的阻塞队列

每个pipline中阻塞队列的每一侧都有一个线程,它运行一个循环,使数据包排队或出列。这些线程从控制器对象异步启动(即“发射并忘记”样式)。此控制器对象具有Dictionary<int, ChannelPipeline>集合,其中包含所有管道对象。

这是我的问题:我可以使用什么机制来告诉我所有管道何时完成处理?每个管道上都有EndOfData属性;我是否必须在每个管道上不断轮询该属性,直到它们都读取true,或者是否有更好(即更有效)的方式?

1 个答案:

答案 0 :(得分:2)

如果您知道管道总数,可以考虑AutoResetEvent +整数计数器

AutoResetEvent allThreadsDone = new AutoResetEvent(false);
int completedThreads;
int scheduledThreads;

基本上每个工作线程都会增加它使用的值Interlocked.Increment(),并在它是最后一个线程时设置事件:

Interlocked.Increment(ref completedThreads);
if (completedThreads == scheduledThreads)
{
    allThreadsDone.Set();
}

在监控线程中你只需:

 allThreadsDone.WaitOne();
   // here is we know that all threads are finished