C# 是否卸载默认AppDomain的事件?

C# 是否卸载默认AppDomain的事件?,c#,.net,multithreading,appdomain,C#,.net,Multithreading,Appdomain,我需要在任何AppDomain卸载时触发一个事件,包括进程的默认事件。AppDomain.DomainUnload的问题是,它仅对非默认AppDomains激发。此外,AppDomain.ProcessExit的执行时间有限,这是我无法依赖的 任何关于我如何实现这一目标的建议都将不胜感激 (或者,在后台线程(thread.IsBackground==True)工作时触发事件。)。但这也是在卸载域之前调用的 取自 在.NET Framework 2.0版中,有一个专用于卸载应用程序域的线程。这提高

我需要在任何AppDomain卸载时触发一个事件,包括进程的默认事件。AppDomain.DomainUnload的问题是,它仅对非默认AppDomains激发。此外,AppDomain.ProcessExit的执行时间有限,这是我无法依赖的

任何关于我如何实现这一目标的建议都将不胜感激

(或者,在后台线程(thread.IsBackground==True)工作时触发事件。)

。但这也是在卸载域之前调用的

取自 在.NET Framework 2.0版中,有一个专用于卸载应用程序域的线程。这提高了可靠性,尤其是在托管.NET Framework时。当线程调用卸载时,目标域被标记为卸载。专用线程尝试卸载域,域中的所有线程都被中止。如果一个线程没有中止,例如因为它正在执行非托管代码,或者因为它正在执行finally块,那么在一段时间后,在最初调用Unload的线程中抛出CannotUnloadAppDomainException。如果无法中止的线程最终结束,则不会卸载目标域。因此,在.NET Framework 2.0版中,不保证卸载域,因为可能无法终止正在执行的线程

。但在卸载域之前再次调用该函数

取自
在.NET Framework 2.0版中,有一个专用于卸载应用程序域的线程。这提高了可靠性,尤其是在托管.NET Framework时。当线程调用卸载时,目标域被标记为卸载。专用线程尝试卸载域,域中的所有线程都被中止。如果一个线程没有中止,例如因为它正在执行非托管代码,或者因为它正在执行finally块,那么在一段时间后,在最初调用Unload的线程中抛出CannotUnloadAppDomainException。如果无法中止的线程最终结束,则不会卸载目标域。因此,在.NET Framework 2.0版中,不保证卸载域,因为可能无法终止正在执行的线程

在主应用程序周围使用包装器/启动器怎么样?AppDomain可以注意到其子节点何时结束(通过阻塞、轮询或回调),并可以执行所需的任何其他操作

同样,如果main()包含启动一个线程来完成所有重要的工作,那么main()还可以执行任何需要的额外工作


如果您能解释一下在每次AppDomain终止时需要做什么,也许会有所帮助?这可能是因为您要求执行的操作在AppDomain级别不合适。

在主应用程序周围使用包装器/启动器怎么样?AppDomain可以注意到其子节点何时结束(通过阻塞、轮询或回调),并可以执行所需的任何其他操作

同样,如果main()包含启动一个线程来完成所有重要的工作,那么main()还可以执行任何需要的额外工作


如果您能解释一下在每次AppDomain终止时需要做什么,也许会有所帮助?可能是您要求执行的操作在AppDomain级别不合适。

如果您的目标是干净地处理某些后台线程使用的对象,那么我的建议是:

  • 当您想退出应用程序时,向后台线程发出信号,要求它们清理并停止

  • 在主线程中,使用
    thread.Join
    等待所有后台线程完成并退出


  • 如果您的目标是干净地处理一些后台线程使用的对象,那么我的建议是:

  • 当您想退出应用程序时,向后台线程发出信号,要求它们清理并停止

  • 在主线程中,使用
    thread.Join
    等待所有后台线程完成并退出


  • 为什么不把代码放在Main的末尾

    至于一个事件:


    不,卸载应用程序域时不会执行任何事件。如果您是一名库开发人员,您可以向entry类添加析构函数。但要注意,可能不会妥善收集所有信息。阅读以下答案:

    为什么不将代码放在Main的末尾

    至于一个事件:


    不,卸载应用程序域时不会执行任何事件。如果您是一名库开发人员,您可以向entry类添加析构函数。但要注意,可能不会妥善收集所有信息。阅读以下答案:

    你想抓住什么?您使用的是ASP.Net、Winforms、WPF还是控制台?在应用程序、DLL或服务中?普通控制台应用程序。我只想在默认AppDomain退出时(即Main结束时)触发一个事件。为什么不将代码放在Main的末尾?如果要处理在卸载的默认AppDomain之后运行的某些内容。您认为代码将在哪个AppDomain中运行?我可能错了,但对我来说,这就像让一只鸡在它不再活着的时候下蛋一样D我认为.net只允许查看主机进程加载的应用程序域……理想情况下,事件将在卸载域之前触发。:)你想抓什么?您使用的是ASP.Net、Winforms、WPF还是控制台?在应用程序、DLL或服务中?普通控制台应用程序。我只想在默认AppDomain退出时(即Main结束时)触发一个事件。为什么不将代码放在Main的末尾?如果要处理在卸载的默认AppDomain之后运行的某些内容。您认为代码将在哪个AppDomain中运行?我可能会生气