gpt4 book ai didi

c# - AppDomain.Unload 抛出终结器?

转载 作者:太空狗 更新时间:2023-10-29 20:06:12 27 4
gpt4 key购买 nike

到目前为止的故事是这样的,我有一个使用 AppDomain 来执行某些任务的 worker thingy。该域的设置和拆卸成本很高。所以我为工作人员创建了一个 WeakReference 对象的每个线程缓存,如下所示:

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
}

我遇到的问题是,当 GC 收集时,似乎总是在调用 AppDomain.Unload 时抛出异常:

System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)"

所以我觉得这很奇怪,我知道我在那个域中没有任何“运行”的东西......这是怎么回事?经过一些挖掘和反复试验,我想到了这个:

    ~Worker()
{
new Action<AppDomain>(AppDomain.Unload)
.BeginInvoke(_domain, null, null);
}

所以我的问题是:

  1. AppDomain.Unload 是否总是会从 Finalizer 失败?为什么?
  2. 我是否会遇到上述解决方法的任何“不良”情况?

最佳答案

AppDomain 由单独的 CLR 线程卸载。当终结器线程正在运行时,该线程无法运行。您得到异常是因为 CLR 注意到卸载线程没有取得进展。它永远不会继续,因为终结器线程在 Unload 调用时被阻塞。

死锁。

您的解决方法确实解决了这个僵局。在这里,显式卸载而不是依赖终结器是更好的方法。

关于c# - AppDomain.Unload 抛出终结器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064749/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com