我正在解决一个错误,该错误在应用程序关闭之前并不总是执行代码。该代码位于 AppDomain.CurrentDomain.DomainUnload 事件的处理程序中。
我发现有同样问题的人收到此建议的帖子
“当您的默认应用程序域发生 DomainUnload 事件时,您的 代码已停止执行。您可能可以使用以下命令执行您需要的操作 默认 AppDomain 上的 ProcessExit 事件。”
这对我有用,但我想知道为什么。我无法找到关于这些事件或它们之间的差异的太多信息。我还想知道我是否需要订阅两者,或者 ProcessExit 是否足够。
编辑:
我想添加更多信息以使其更有用。
我忽略了新线程是在它们自己的 AppDomain 中创建的。因为我希望这段代码不仅在父进程完成时运行,而且在每个线程完成时运行,所以我需要订阅 DomainUnload 事件来处理每个线程完成时的情况,还需要订阅 ProcessExit 事件来在父进程完成时捕获。
ProcessExit
应该足够了。
DomainUnload
事件被设计为由其他 AppDomain 处理,而不是被卸载的 AppDomain
。因此,如果处理程序附加在正在卸载的域中,它可能无法运行。 ProcessExit
事件设计为在进程即将 退出时运行。
.Net core 删除了多个
AppDomain
(以及 AppDomain.DomainUnload
事件)。 AppDomain.DomainUnload
永远不会被触发。
请参阅 https://learn.microsoft.com/en-us/dotnet/fundamentals/syslib-diagnostics/syslib0024 和 https://learn.microsoft.com/en-us/dotnet/api/system.appdomain ?view=net-8.0#remarks:
在 .NET Core 上,
实现受设计限制,不提供隔离、卸载或安全边界。对于 .NET Core,只有一个AppDomain
。通过AppDomain
提供隔离和卸载。安全边界应由进程边界和适当的远程技术提供。AssemblyLoadContext