介入等待太久的线程

时间:2013-11-01 16:04:39

标签: multithreading concurrency f#

在F#中有没有我可以检测到当前等待线程是否在没有联系的情况下等待太长时间?

我有一种情况,线程必须主动联系其他等待的线程,以便在完成后将其工作传递给他们。我的解决方案是在某个地方有一个错误,有时一个或多个线程等待太久,最终程序陷入僵局,因为其他线程不联系它们。

我认为通过检测等待线程是否只是等待太久,它会主动寻找可用的工作,而不是等待其他线程传递给它。

1 个答案:

答案 0 :(得分:1)

尝试理解为什么你的线程卡住而不仅仅是终止它们可能更好。如果您可以使用附加的Visual Studio调试器重现此项,则可以单击“暂停”按钮并使用“线程”窗口查看所有线程所在的代码。

那说;如果您仍然需要这样做,解决方案将取决于您如何管理线程。要从外部监视它们,您需要一些具有线程列表并能够判断它们是否已经死亡的进程。

除了Thread之外,Name类没有任何内置机制可以在线程及其控件之间共享状态。您可能会滥用名称,但我可能会有一个线程安全的集合(例如,一个ConcurrentDictionary<Thread, DateTime>)来存储所有线程和上次通信的时间戳,并将Action传递给每个线程在启动时允许它通过定期调用动作来“Ping”。该操作只会更新针对该线程存储的DateTime

控制过程然后只是定期扫描字典,查找时间戳太旧的任何内容,声明该线程已死并Aborts()它。

很难在不确切知道如何生成线程的情况下提供代码示例,并且更详细地描述了“被联系”的线程。