经过一个月的休息后,我昨天继续研究我的程序。我没有更改代码上的任何内容,但现在我的应用程序不再启动。在某一时刻,它只是中断执行并且似乎陷入死锁,尽管我不确定它是否真的是死锁,因为它在方法返回时发生 - 在通常不应该发生的地方。
我不能给你看代码,因为它很大。但我可以肯定地说,除了它自己的线程之外,唯一的操作是访问一些由 Dispatcher 调用的 UI 元素。直到昨天一切正常,我没有改变任何东西。
这是它发生的地方:
internal override Task InitializeAddIns()
{
try
{
Action action = () => this._addinProvider.InitializeAddins();
Task t = Task.Factory.StartNew(action);
return t;
}
catch (Exception ex)
{
Debugger.Break();
return null;
}
}
调用代码:
// Initialize AddIns
splash.SplashText = "SplashScreen:step_searchAddIns".Translate();
this._addinSystem.InitializeAddIns();
splash.SplashText = "SplashScreen:step_startAddIns".Translate();
await Task.Run(() => this._addinSystem.RunAddins());
// Resolve libraries with NativeCompressor
splash.SplashText = "SplashScreen:step_resolveDependencies".Translate();
任务启动并返回“t”。InitializeAddins() 方法成功运行以结束(使用调试器检查它 - 日志还显示它完全完成)。下一步是标记“动作”的声明行(完成时)。然后调试结束,没有任何事情发生。甚至没有调用这个 Dispatcher 钩子:
Dispatcher.CurrentDispatcher.Hooks.DispatcherInactive += (sender, args) => this.Update();
我唯一的假设是某处出现了僵局。我无法解释为什么整个执行停止并卡住了。我只是找不到任何线索从哪里开始搜索。我重新编写了新引入的代码并添加了一些扩展锁定方法,这些方法也可以检测死锁。到目前为止没有检测到死锁。
由于不知道是什么原因导致的,所以我尝试使用 WinDbg 和 SOSEX 来查找错误源。可悲的是,我没有让 WinDbg 运行。它确实检查了符号服务器,最后的输出如下:
CLRDLL:无法通过 mscorwks 搜索找到 mscordacwks_AMD64_x86_4.0.30319.34209.dll CLRDLL:无法在路径上找到“SOS_AMD64_x86_4.0.30319.34209.dll” 无法自动加载 SOS CLRDLL:已加载 DLL mscordacwks_AMD64_x863409DLL CLR 状态: 加载 DLL mscordacwks_AMD64_x86_4.0.30319.34209.dll
虽然它显然加载了一些东西,但我在调用 SOSEX 的 !dlk 命令时收到了这条消息:
0:028> !dlk 无法初始化 .NET 数据接口。需要 mscordacwks.dll 版本 4.0.30319.34209。找到并加载正确版本的 mscordacwks.dll。请参阅 .cordll 命令的文档。正在检查 CriticalSections... 未检测到死锁。
所以我真的不知道如何修复这个错误。这种行为可能是什么原因?我什至没有例外。我已经启用了 CLR 异常,但连那些都没有被抛出。这很奇怪,我通常认为这种锁定确实发生在中间的某个地方,而不是在方法退出之后......