ProcessExit 与 DomainUnload

问题描述 投票:0回答:2

我正在解决一个错误,该错误在应用程序关闭之前并不总是执行代码。该代码位于 AppDomain.CurrentDomain.DomainUnload 事件的处理程序中。

我发现有同样问题的人收到此建议的帖子

“当您的默认应用程序域发生 DomainUnload 事件时,您的 代码已停止执行。您可能可以使用以下命令执行您需要的操作 默认 AppDomain 上的 ProcessExit 事件。”

这对我有用,但我想知道为什么。我无法找到关于这些事件或它们之间的差异的太多信息。我还想知道我是否需要订阅两者,或者 ProcessExit 是否足够。

编辑:

我想添加更多信息以使其更有用。

我忽略了新线程是在它们自己的 AppDomain 中创建的。因为我希望这段代码不仅在父进程完成时运行,而且在每个线程完成时运行,所以我需要订阅 DomainUnload 事件来处理每个线程完成时的情况,还需要订阅 ProcessExit 事件来在父进程完成时捕获。

c# .net appdomain
2个回答
14
投票

ProcessExit
应该足够了。

DomainUnload
事件被设计为由其他 AppDomain 处理,而不是被卸载的
AppDomain
。因此,如果处理程序附加在正在卸载的域中,它可能无法运行。
ProcessExit
事件设计为在进程即将 退出时运行。


0
投票

.Net core 删除了多个

AppDomain
(以及
AppDomain.DomainUnload
事件)。
AppDomain.DomainUnload
永远不会被触发。

请参阅 https://learn.microsoft.com/en-us/dotnet/fundamentals/syslib-diagnostics/syslib0024https://learn.microsoft.com/en-us/dotnet/api/system.appdomain ?view=net-8.0#remarks:

在 .NET Core 上,

AppDomain
实现受设计限制,不提供隔离、卸载或安全边界。对于 .NET Core,只有一个
AppDomain
。通过
AssemblyLoadContext
提供隔离和卸载。安全边界应由进程边界和适当的远程技术提供。

© www.soinside.com 2019 - 2024. All rights reserved.