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

C# 如何确定所有线程何时完成执行?,c#,multithreading,.net-3.5,concurrency,notifications,C#,Multithreading,.net 3.5,Concurrency,Notifications,我有一个体系结构,它从打包的二进制文件中读取数据包,根据数据包类型将每个数据包分配给一个单独的处理管道,并将数据包重新组装到管道另一端的一个新文件中。每个管道都包含类似于的阻塞队列 在每个pipline中,阻塞队列的每一侧都有一个线程,该线程运行一个对数据包进行排队或出列的循环。这些线程从控制器对象异步启动(即“启动并忘记”样式)。此控制器对象有一个字典集合,其中包含所有管道对象 我的问题是:我可以设置什么机制来告诉我所有管道何时完成处理?每个管道上都有一个EndOfData属性;我是否必须连续

我有一个体系结构,它从打包的二进制文件中读取数据包,根据数据包类型将每个数据包分配给一个单独的处理管道,并将数据包重新组装到管道另一端的一个新文件中。每个管道都包含类似于的阻塞队列

在每个pipline中,阻塞队列的每一侧都有一个线程,该线程运行一个对数据包进行排队或出列的循环。这些线程从控制器对象异步启动(即“启动并忘记”样式)。此控制器对象有一个
字典
集合,其中包含所有管道对象


我的问题是:我可以设置什么机制来告诉我所有管道何时完成处理?每个管道上都有一个
EndOfData
属性;我是否必须连续地在每个管道上轮询该属性,直到它们全部读取<代码>真/ <代码>,或者是否有更好的(即更有效的)方式?

< p>如果您知道可以考虑的管道总数:“代码> AutoReTebug事件/代码> +整数计数器< /P>
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

不,这只会阻止线程完成。一个信号量的计数方式是错误的。@Hans Passant:是的,我修正了这一点,基本上删除了一个使用信号量的想法,因为看不到处理信号量的方式是满/空的。如果你使用的是.NET 4.0,你也可以使用,这似乎正好提供了这一功能。使
EndOfData
成为
AutoResetEvent
WaitHandle.WaitAll()
是你的朋友。@Hans Passant:除非他有超过64个管道(或WaitHandles),否则似乎不允许同时等待更多的句柄。