Multithreading 等待时间过长的中间线程

Multithreading 等待时间过长的中间线程,multithreading,concurrency,f#,Multithreading,Concurrency,F#,在F#中是否存在我可以检测当前等待线程是否等待太久而未被联系的情况 我有一个例子,线程必须主动联系其他等待的线程,以便在完成工作后将其工作传递给其他线程。我的解决方案是在某个地方有一个bug,有时一个或多个线程只是等待太长时间,最终程序死锁,因为其他线程没有联系到它们 我认为,通过检测一个等待的线程是否只是等待太长时间,它只会主动寻找可用的工作,而不是一直等待其他线程传递给它。与其终止线程,不如尝试了解线程为何会卡住。如果可以在附加了VisualStudio调试器的情况下复制此代码,则可以单击“

在F#中是否存在我可以检测当前等待线程是否等待太久而未被联系的情况

我有一个例子,线程必须主动联系其他等待的线程,以便在完成工作后将其工作传递给其他线程。我的解决方案是在某个地方有一个bug,有时一个或多个线程只是等待太长时间,最终程序死锁,因为其他线程没有联系到它们


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

与其终止线程,不如尝试了解线程为何会卡住。如果可以在附加了VisualStudio调试器的情况下复制此代码,则可以单击“暂停”按钮并使用“线程”窗口查看所有线程都包含哪些代码

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

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

然后,控制进程只是周期性地在字典中扫描时间戳太旧的任何内容,声明线程已死亡,并中止()


给出一个代码示例时,如果不确切知道您是如何生成线程的,并更详细地描述“正在联系”的线程的含义,则很难给出代码示例。

取决于您等待的方式,但通常情况下,等待函数有一些您可以设置的超时。例如,见: