卸载默认AppDomain的事件?

时间:2010-12-28 21:49:34

标签: c# .net multithreading appdomain

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

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

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

4 个答案:

答案 0 :(得分:1)

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

至于事件:

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

答案 1 :(得分:0)

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版域中不保证卸载,因为它可能无法终止执行线程。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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