以下是一些示例代码:
using System;
namespace UnloadFromFinalizer
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
}
AppDomain domain;
Program()
{
this.domain = AppDomain.CreateDomain("MyDomain");
}
~Program()
{
AppDomain.Unload(this.domain);//<-- Exception thrown here
}
}
}
我有一个类,它在构造函数中创建一个AppDomain,用于在对象的生命周期内使用。我想正确清理AppDomain,所以我想我会在终结器中调用Unload。不幸的是,这会导致抛出CannotUnloadAppDomainException。 AppDomain.Unload注释的MSDN文档:
在某些情况下,调用Unload会导致一个即时的CannotUnloadAppDomainException,只要在终结器中调用它就足够了。
这是为什么?是否已清除成员变量“domain”?该清理是否自动包括卸载AppDomain,还是以某种无法访问的方式存在?有什么我应该做的,或者我可以安全地转储终结器? (只要在过程中完全清理了GC,我就不在乎GC何时清除了我的对象。)
答案 0 :(得分:3)
AppDomain
类没有定义终结器,因此只会像往常一样进行垃圾回收。将从垃圾收集器的终结器线程调用Program
类的终结器。发生这种情况时,无法保证您的AppDomain
实例将会或不会被垃圾收集,因此您将得到不确定的行为。
我不打算使用Program
的终结器,因为AppDomain
无论如何都会收集垃圾,此外,当Main
方法退出时整个过程将被销毁