无论如何,在 F# 中我可以检测到当前等待线程是否等待太久而没有被联系?
我有一个案例,线程必须主动联系其他等待线程,以便在它们完成后将它们的工作传递给它们。我的解决方案是在某处出现错误,有时一个或多个线程等待太久,最终程序陷入僵局,因为其他线程不联系它们。
我认为通过检测等待线程是否只是等待太久,它只会主动寻找可用的工作,而不是一直等待其他线程传递给它。
无论如何,在 F# 中我可以检测到当前等待线程是否等待太久而没有被联系?
我有一个案例,线程必须主动联系其他等待线程,以便在它们完成后将它们的工作传递给它们。我的解决方案是在某处出现错误,有时一个或多个线程等待太久,最终程序陷入僵局,因为其他线程不联系它们。
我认为通过检测等待线程是否只是等待太久,它只会主动寻找可用的工作,而不是一直等待其他线程传递给它。
尝试了解线程卡住的原因可能比仅仅终止它们更好。如果您可以使用附加的 Visual Studio 调试器重现此问题,则可以单击“暂停”按钮并使用“线程”窗口查看所有线程所在的代码。
那就是说;如果您仍然需要这样做,解决方案将取决于您如何管理线程。要从外部监视它们,您将需要一些具有线程列表并能够判断它们是否已死的进程。
Thread
除了Name
. _ 您可能会滥用名称,但我可能会有一个线程安全的集合(例如 a ConcurrentDictionary<Thread, DateTime>
)来存储所有线程和它们最后一次通信的时间戳,并Action
在每个线程启动时将其传递给它以“ Ping
”通过定期调用动作。DateTime
该操作将简单地针对该线程更新存储的内容。
然后,控制进程简单地定期扫描字典以查找时间戳太旧的任何内容,并声明该线程已死亡Aborts()
。
如果不确切知道如何生成线程并更详细地描述线程“被联系”的含义,就很难给出代码示例。