杀死线程,真的
本文关键字:真的 线程 | 更新日期: 2023-09-27 18:03:30
我需要终止一个冻结的线程,我将IsBackground设置为true,但它仍然存活。线程的属性:
ThreadState = abortrerequested
IsBackground = true
当我检查冻结点时,我发现下面的行:
resultDetect = Detect(input, ref output);
现场是第三方代码(方法检测)。如您所见,线程只更新resultDetect。我需要中止那个线程,重新启动一个新的线程来继续。否则,应用程序等待,什么也不做-fresh resultDetect required -
我如何杀死没有死的线程?
只有一种方法可以安全地终止应用程序中挂起的线程:Environment。如果线程正在运行内核代码,即使这样也可能失败。
最好不要使用挂起的第三方代码。如果您别无选择,那么在一个单独的进程中运行它。
如果Detect
转换为非托管代码,则CLR将延迟ThreadAbortException
的注入,直到它返回。这种行为在。net 2.0中改变了,使线程中止更加安全。CLR真的在努力保护你不破坏进程的状态,这在非托管代码的情况下很可能发生,因为你没有得到应用程序域隔离的好处,而在全托管场景下,应用程序域可以很容易地卸载。实际上,唯一的解决方案是在一个单独的进程中运行这个API,并使用WCF、remoting等与之通信。
也许试着打电话给Thread.Abort()
。尽管不建议这样做(参见终止。net线程)