c# - 如何在 WPF C# 应用程序中禁用终止超时?
问题描述
我正在处理的应用程序在关闭时崩溃。该应用程序包括从动态库加载的 C++ 本机代码。
本机代码通过 GC 终结器线程开始清理,当它的主容器(这是一个 CLR 类)被 GC 删除时。
经过大量挖掘,我发现这纯粹是时间相关的 - 如果我添加Sleep(10000)
到应用程序关闭时正在运行的本机清理功能之一,它会崩溃。之所以会发生这种情况,是因为整个原生部分都有一个基本上如下所示的检查:
// native library destruction
~MyEntireDll()
{
if(!EverythingProperlyCleanedUp())
{
log("Killed without proper cleanup.");
CrashOnPurpose();
}
}
同事建议这是因为当你在 WPF 中按下关闭按钮时,它会发出线程结束的信号,如果它们在设定的时间内没有这样做,它会以艰难的方式杀死它们。这意味着当我们的程序的本机部分需要很长时间来清理时,它会被杀死 - 但是在像这样被杀死时,仍然会调用全局对象的析构函数。
无论如何,我们不希望它在没有适当清理的情况下被杀死 - 我们发现由于上面的故意崩溃是一件好事。
我的问题是,我在哪里设置在杀死后台线程之前要等待多长时间?我可以禁用此功能并使用自己的方式处理挂起吗?我在文档中没有找到任何内容,实际上我根本没有发现超时。
解决方案
推荐阅读
- scala - Scala spark:访问数组类型列中结构中的值?(或者,匿名结构类型列的访问成员)
- python - 如何根据条件从 DF 创建 DF
- sql - 当整个列为 0 或 null 时,有没有办法可以隐藏 Oracle View 透视中的列?
- python - PyCharm SonarLint 如何查看所有文件的所有问题?
- python - 如何从python中的txt文件制作数字列表?
- git - Git远程跟踪分支和上游分支不同
- c# - 如何在 UWP 中启动应用程序时显示音乐库中的所有文件
- c - 检查给定主机上的端口是否打开
- flutter - 如何在颤动中重置矩阵手势检测器小部件中的矩阵比例?
- clickhouse - ClickHouse - 了解查询探查器