卸载默认AppDomain的事件?

每当任何 AppDomain卸载时我都需要触发一个事件 – 包括该进程的默认事件。 AppDomain.DomainUnload的问题在于它仅针对非默认AppDomain触发。 此外,AppDomain.ProcessExit的执行时间有限,我不能依赖它。

任何关于如何实现这一点的建议将不胜感激!

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

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

至于一个事件:

在卸载应用程序域时,不存在将执行的事件。 如果您是库开发人员,则在入门类中添加析构函数。 但请注意,可能无法正确收集所有内容。 阅读此答案: https : //stackoverflow.com/a/2735431/70386

http://msdn.microsoft.com/en-us/library/system.appdomain.domainunload%28v=VS.90%29.aspx ..但是在卸载域之前再次调用它。

摘自http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx在.NET Framework 2.0版中,有一个专门用于卸载应用程序域的线程。 这提高了可靠性,尤其是在托管.NET Framework时。 当线程调用Unload时,目标域将标记为卸载。 专用线程尝试卸载域,并且域中的所有线程都将中止。 如果线程没有中止,例如因为它正在执行非托管代码,或者因为它正在执行finally块,那么在一段时间之后,在最初调用Unload的线程中抛出CannotUnloadAppDomainException。 如果最终无法中止的线程结束,则不会卸载目标域。 因此,在.NET Framework 2.0版域中不保证卸载,因为它可能无法终止执行线程。

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

同样,如果main()包含启动执行所有重要操作的单个线程,那么main()也可以执行所需的任何其他工作。

如果您能够解释每个AppDomain终止时需要做些什么,也许会有所帮助? 可能是你要求做的事情在AppDomain级别上是不合适的。

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

  1. 当您希望退出应用程序时,请向后台线程发出信号,告知它们应该清理并停止。

  2. 从主线程中,使用Thread.Join等待所有后台线程完成并退出。