我有一个架构,它从打包的二进制文件中读取数据包,根据数据包类型将每个数据包分配给一个单独的处理管道,然后将数据包重新组装到管道另一端的新文件中。每个管道都包含类似于this one.
的阻塞队列每个pipline中阻塞队列的每一侧都有一个线程,它运行一个循环,使数据包排队或出列。这些线程从控制器对象异步启动(即“发射并忘记”样式)。此控制器对象具有Dictionary<int, ChannelPipeline>
集合,其中包含所有管道对象。
这是我的问题:我可以使用什么机制来告诉我所有管道何时完成处理?每个管道上都有EndOfData
属性;我是否必须在每个管道上不断轮询该属性,直到它们都读取true
,或者是否有更好(即更有效)的方式?
答案 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