为什么终结器中的AppDomain.Unload()错误?

时间:2009-12-11 23:09:11

标签: c# .net garbage-collection appdomain finalizer

以下是一些示例代码:

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何时清除了我的对象。)

1 个答案:

答案 0 :(得分:3)

AppDomain类没有定义终结器,因此只会像往常一样进行垃圾回收。将从垃圾收集器的终结器线程调用Program类的终结器。发生这种情况时,无法保证您的AppDomain实例将会或不会被垃圾收集,因此您将得到不确定的行为。

我不打算使用Program的终结器,因为AppDomain无论如何都会收集垃圾,此外,当Main方法退出时整个过程将被销毁