首页 > 解决方案 > 如何在 WPF C# 应用程序中禁用终止超时?

问题描述

我正在处理的应用程序在关闭时崩溃。该应用程序包括从动态库加载的 C++ 本机代码。

本机代码通过 GC 终结器线程开始清理,当它的主容器(这是一个 CLR 类)被 GC 删除时。

经过大量挖掘,我发现这纯粹是时间相关的 - 如果我添加Sleep(10000)到应用程序关闭时正在运行的本机清理功能之一,它会崩溃。之所以会发生这种情况,是因为整个原生部分都有一个基本上如下所示的检查:

// native library destruction
~MyEntireDll()
{
  if(!EverythingProperlyCleanedUp())
  {
    log("Killed without proper cleanup.");
    CrashOnPurpose();
  }
}

同事建议这是因为当你在 WPF 中按下关闭按钮时,它会发出线程结束的信号,如果它们在设定的时间内没有这样做,它会以艰难的方式杀死它们。这意味着当我们的程序的本机部分需要很长时间来清理时,它会被杀死 - 但是在像这样被杀死时,仍然会调用全局对象的析构函数。

无论如何,我们不希望它在没有适当清理的情况下被杀死 - 我们发现由于上面的故意崩溃是一件好事。

我的问题是,我在哪里设置在杀死后台线程之前要等待多长时间?我可以禁用此功能并使用自己的方式处理挂起吗?我在文档中没有找到任何内容,实际上我根本没有发现超时。

标签: c#wpfmultithreadingclr

解决方案


推荐阅读