杀死线程,真的!

时间:2011-07-25 12:42:05

标签: c# multithreading

我需要终止一个冻结的线程,我将IsBackground设置为true但它仍然存活。线程的属性:

  

ThreadState = AbortRequested

     

IsBackground = true

当我检查冻结点时,我找到下面的一行:

resultDetect = Detect(input, ref output);

该地点是第三方代码(方法检测)。线程仅在您看到时更新resultDetect。我需要中止该线程并重新启动一个新线程才能继续。否则,应用程序等待并且不执行任何操作 - 需要新的resultDetect -

如何杀死不死的线程?

3 个答案:

答案 0 :(得分:4)

只有一种方法可以安全地杀死应用程序中的挂起线程:Environment.Exit如果线程正在运行内核代码,那么即使这样也会失败。

最好不要使用挂起的第三方代码。如果您别无选择,请在单独的过程中运行它。

答案 1 :(得分:2)

如果Detect转换为非托管代码,则CLR将推迟注入ThreadAbortException直到它返回。在.NET 2.0中,此行为已更改,以使线程中止更安全。 CLR正在努力保护您免受破坏过程状态的影响,这在非托管代码的情况下非常可能,因为您没有获得可以在所有托管方案下轻松卸载的应用程序域的隔离的好处。实际上,唯一的解决方案是在单独的进程中运行此API并使用WCF,远程处理等与之通信。

答案 2 :(得分:1)

也许尝试拨打Thread.Abort()。虽然不推荐(见Killing a .NET thread