【问题标题】:Kill thread, really!杀死线程,真的!
【发布时间】:2011-07-25 12:42:04
【问题描述】:

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

ThreadState = AbortRequested

IsBackground = true

当我检查冻结点时,我发现下面一行:

resultDetect = Detect(input, ref output);

该位置是第 3 方代码(方法检测)。如您所见,该线程仅更新 resultDetect 。我需要中止该线程并重新启动一个新线程以继续。否则,应用程序等待并且什么都不做 -fresh resultDetect required-

如何杀死不死的线程?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

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

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

    【讨论】:

    • 这已经是服务器端的代码了。方法扫描大量数据(~1GB RAM)。如何以超快的方式开始新流程?假设我将服务器端分成基本/内存部分和扫描部分......所以我可以杀死扫描部分。我想我会问一个新问题。
    • @Nime:这里没有足够的细节可以继续,但我会提到MemoryMappedFile 类允许在进程之间共享内存,所以这是让扫描进程读取的快速方法-只能访问少量数据,同时仍然能够独立于主进程将其杀死。
    【解决方案2】:

    如果Detect 转换为非托管代码,则CLR 将推迟ThreadAbortException 的注入,直到它返回。这种行为在 .NET 2.0 中发生了变化,使线程中止更加安全。 CLR 非常努力地保护您免受破坏进程的状态,这在非托管代码的情况下很可能发生,因为您无法从应用程序域的隔离中受益,这些应用程序域可以在所有托管的情况下轻松卸载.确实,唯一的解决方案是在单独的进程中运行这个 API,并使用 WCF、remoting 等与之通信。

    【讨论】:

      【解决方案3】:

      也许可以尝试致电Thread.Abort()。虽然不推荐(见Killing a .NET thread

      【讨论】:

      • 我在计时器中尝试...没有帮助。
      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 2011-04-19
      • 1970-01-01
      • 2010-09-08
      • 2021-11-13
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多