【问题标题】:How can I make a thread wait until another thread is wating (C#)如何让一个线程等到另一个线程正在等待(C#)
【发布时间】:2017-02-08 01:58:51
【问题描述】:

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

【问题讨论】:

  • 你必须使用显式工作线程吗?您不能将它们表示为Tasks 吗?然后使用Task.WhenAll 检查是否所有任务都已完成。如果您确实必须使用线程,请查看 AutoResetEventsWaitHandle.WaitAll
  • 是的,任务可以更好地工作。我不太确定我使用的 .net 版本是否有任务。也许在紧密循环中创建任务是错误的,因为我在 Xamarin 上使用 Mono,而且垃圾收集器不是很好。

标签: c# multithreading parallel-processing wait


【解决方案1】:

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

从您提供的信息看来,您确实在构建一个状态机,只是跨多个线程。

我会创建一个Singleton 并让它充当状态机。线程可以向 Singleton 那里的状态发出信号。

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    对简短的回答表示歉意(稍后可能会扩展),但您可能使用了 WaitHandle.WaitAll 方法,并结合了 ManualResetEvent。您可以在创建 ManualResetEvent 对象时将它们传递给每个工作线程,在它们空闲时向它们发出信号,并将整个句柄集传递给 WaitHandle.WaitAll 方法以在它们完成时唤醒观察线程。如果您想在等待时定期运行某种任务,或者如果任务花费的时间过长,您也可以使用此方法的超时功能。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 2015-02-22
      • 2011-07-10
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多