【发布时间】:2013-12-13 02:00:01
【问题描述】:
我正在启动多个线程,想知道 any 什么时候结束。我知道以下代码:
foreach (Thread t in threads)
t.Join();
但它只会等待所有个线程在一起。那太晚了。我需要知道一个线程何时完成,即使其他线程仍在运行。我正在寻找与WaitAny 等效的东西,仅用于线程。但我无法向我正在监视的所有线程添加代码,因此不能选择使用信号或其他同步对象。
一些澄清:我正在开发一个记录应用程序活动的记录/跟踪工具。我可以在线程启动时插入日志语句,但我不能在线程外的所有可能方式上插入日志语句(多个退出点、异常等)。所以我想注册新线程,然后在它完成写入日志条目时收到通知。我可以在每个线程上异步Join,但这意味着每个受监控线程都有第二个线程,这可能看起来有点太多开销。线程通过多种方式使用,无论是BackgroundWorker、Task 还是池线程。从本质上讲,它是一个线程,我想知道它什么时候完成。确切的线程机制由应用程序定义,而不是日志记录解决方案。
【问题讨论】:
-
这是代码异味。您不会知道哪个线程完成了,因此您无法推断实际完成了什么工作。
-
我添加了更多关于我正在尝试做的事情的背景信息。当然我需要知道哪个线程已经结束了,否则在这种情况下就没用了。
-
我和汉斯一起做这个。为什么你的线程代码有多个退出点?在所有线程代码周围放置一个 try/catch,如果你想在中间的某个地方退出,则抛出。现有答案涵盖了我所有其他疑问 - 为什么您不断创建/终止/销毁线程,而不是使用刚刚收到信号的池或应用程序生命周期线程?
-
再一次,我无法控制应用程序对线程的操作。我的目标只是提供一个日志记录解决方案,该解决方案将在线程完成时写入日志条目。如果我可以完全控制要记录的内容,那么我当然可以按照您的建议进行操作。
标签: c# multithreading synchronization