【发布时间】:2010-12-14 07:46:29
【问题描述】:
我有线程池的任务队列,每个任务都有冻结锁定它正在使用的所有资源的趋势。并且除非重新启动服务,否则这些无法释放。
ThreadPool 中有没有办法知道它的线程已经被冻结了?我有一个使用超时的想法,(虽然我仍然不知道怎么写),但我认为它不安全,因为处理的时间长度不统一。
【问题讨论】:
-
一旦你知道一个线程被冻结了你打算怎么做?杀了它?这可能会使线程使用的数据结构处于不一致的状态。你最好找到死锁的根源并修复它。
-
是的,我需要杀死它。它是一种“一劳永逸”的线程,所以我认为如果它被杀死不会造成任何伤害。
-
“我认为如果它被杀死没有伤害” - 著名的遗言......
-
杀死线程是危险的并且是糟糕的做法(尤其是它们调用任何本机代码,这些代码通常包括 .NET API,其功能不仅仅是格式化文本;)。现在,使用它来调用 DebugBreak() 或类似的东西来调查死锁是一个好主意。
标签: c# multithreading threadpool