以下是目前的情况,我有一个使用AppDomain执行某些任务的工作程序。该域的设置和拆除非常昂贵。因此,我为每个线程创建了一个弱引用对象的缓存来维护工作程序,就像这样:
class Worker
{
[ThreadStatic]
static Dictionary<string, WeakReference> _workers;
public static Worker Fetch( ... ) { you get the idea }
private AppDomain _domain;
public Worker(...)
{
_domain = AppDomain.Create( ... );
}
~Worker()
{
AppDomain.Unload(_domain);
}
// bla bla bla
}
我遇到的问题是,当垃圾回收时,调用AppDomain.Unload总是会抛出异常:
System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)"
我认为这很奇怪,因为我知道在该域中没有任何东西在“运行”... 怎么回事? 经过一番挖掘和尝试,我得出了以下结论:
~Worker()
{
new Action<AppDomain>(AppDomain.Unload)
.BeginInvoke(_domain, null, null);
}
所以我的问题是:
- 从终结器中卸载AppDomain是否总是失败?为什么?
- 我会在上述解决方法中遇到任何“不良”情况吗?