如何使线程等到另一个线程正在等待(C#)

时间:2017-02-08 01:58:52

标签: c# multithreading parallel-processing wait

我有一个创建一些工作线程的消费者线程。这些线程必须在活动和等待状态之间切换。当所有工作线程都处于等待状态时,表示当前作业已完成。如何让消费者线程等待所有工作线程处于等待状态?我想要一个与所有工作线程上的Thread.Join()非常类似的行为,但是,我希望线程继续为下一个作业运行。我无法创建新线程,因为作业处于紧凑的循环中并且创建新线程的成本很高。

2 个答案:

答案 0 :(得分:3)

据我所知,没有机制可以做你想做的事。 (Thread.Join,但因为你不能阻止这不是一个选项)

从您提供的信息来看,它听起来就像您正在建立一个状态机,只是跨越多个线程。

我会创建一个Singleton并将其作为状态机。线程可以向Singleton发出状态信号。

听起来你有不确定数量的线程,所以你需要将每个线程的状态放在一个集合中。我会在这里Thread Safe Collections找到适合您希望存储州信息的方式。

希望这有帮助。

答案 1 :(得分:3)

为简短答案道歉(稍后可能会扩展),但您可能是WaitHandle.WaitAll方法,并结合ManualResetEvent。您可以在创建它们时将ManualResetEvent个对象传递给每个工作线程,并在它们变为空闲时发出信号,并将整个句柄集传递给WaitHandle.WaitAll方法以在它们'时唤醒观察线程'重新完成。如果您希望在等待期间定期运行某种任务,或者如果任务花费的时间太长,则还可以执行某种操作。

也可以使用此方法的超时功能。

请注意,如果您的工作线程要在操作完成时终止(如果是这种情况,则不完全清楚),将它们生成为任务并使用Task.WaitAll可能更合适。

编辑:在快速重新阅读时,听起来您确实想要使用任务而不是尝试重用完整的工作线程。任务使用从线程池分配的线程,消除了您担心的线程创建开销,因为线程将(通常)准备就绪并等待工作。您可以简单地生成每个任务并等待它们全部完成。