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

如何使一个线程等待另一个线程等待(C#),c#,multithreading,parallel-processing,wait,C#,Multithreading,Parallel Processing,Wait,我有一个消费线程,它创建了一些工作线程。这些线程必须在活动和等待状态之间切换。当所有工作线程都处于等待状态时,表示当前作业已完成。如何使使用者线程等待所有工作线程处于等待状态?我希望所有工作线程上的行为都与Thread.Join()非常相似,但是,我希望线程在下一个作业中保持运行。我无法创建新线程,因为作业处于一个紧密的循环中,创建新线程的成本很高。据我所知,没有任何机制可以满足您的要求。(Thread.Join,但由于无法阻止,因此这不是一个选项) 从您提供的信息来看,这听起来像是您真正在跨多

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

据我所知,没有任何机制可以满足您的要求。(Thread.Join,但由于无法阻止,因此这不是一个选项)

从您提供的信息来看,这听起来像是您真正在跨多个线程构建状态机

我将创建一个数据库,并将其用作状态机。线程可以向Singleton发出状态信号

听起来你有一个不确定数量的线程,所以你需要把每个线程的状态放在一个集合中。我会在这里寻找适合您希望如何存储状态信息的方法


希望这能有所帮助。

据我所知,没有任何机制可以实现您的愿望。(Thread.Join,但由于无法阻止,因此这不是一个选项)

从您提供的信息来看,这听起来像是您真正在跨多个线程构建状态机

我将创建一个数据库,并将其用作状态机。线程可以向Singleton发出状态信号

听起来你有一个不确定数量的线程,所以你需要把每个线程的状态放在一个集合中。我会在这里寻找适合您希望如何存储状态信息的方法


希望这能有所帮助。

对于这个简短的回答(稍后可能会扩展),我深表歉意,但您可能需要将该方法与。创建
ManualResetEvent
对象时,您可以将它们传递到每个工作线程中,当它们空闲时发出信号,并将整个句柄集传递到
WaitHandle.WaitAll
方法中,以便在它们完成时唤醒观察线程。如果希望在等待时定期运行某种任务,或者如果任务花费的时间太长,则可以使用此方法的超时功能

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


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

对于简短的回答(稍后可能会展开)表示歉意,但您可能需要将该方法与。创建
ManualResetEvent
对象时,您可以将它们传递到每个工作线程中,当它们空闲时发出信号,并将整个句柄集传递到
WaitHandle.WaitAll
方法中,以便在它们完成时唤醒观察线程。如果希望在等待时定期运行某种任务,或者如果任务花费的时间太长,则可以使用此方法的超时功能

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


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

是否必须使用显式工作线程?难道你不能把这些代表为替代品吗?然后使用检查是否所有任务都已完成。如果你必须使用线程,看看和。是的,任务可以更好地工作。我不太确定我使用的.net版本是否有任务。也许在紧循环中创建任务是错误的,因为我在Xamarin上使用Mono,而垃圾收集器不是很好。你必须使用显式工作线程吗?难道你不能把这些代表为替代品吗?然后使用检查是否所有任务都已完成。如果你必须使用线程,看看和。是的,任务可以更好地工作。我不太确定我使用的.net版本是否有任务。也许在紧循环中创建任务是错误的,因为我在Xamarin上使用Mono,而垃圾收集器不是很好。