gpt4 book ai didi

c# - 如何在多线程应用程序中正确卸载 AppDomain?

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:34 25 4
gpt4 key购买 nike

<分区>

我正在尝试卸载一个 AppDomain,但我得到了 CannotUnloadAppDomainException

MSDN 提到了可能引发此异常的 3 个原因:

  1. 默认的应用程序域,在应用程序的生命周期内必须保持加载状态。
  2. 具有无法立即停止执行的正在运行的线程的应用程序域。
  3. 已卸载的应用程序域。

我的应用程序遇到了情况 2)。

它有一些后台线程——例如我有一个搜索索引线程运行它自己的 Dispatcher。

据我所知,当我打电话时

AppDomain.Unload(subDomain);

然后受影响域中的所有线程都会得到一个ThreadAbortException

理想情况下,这意味着所有线程都被“杀死”/停止,对吧?

除了两种情况:

  • 当一个线程调用一些托管代码时——运气不好...
  • 当线程执行 finally 语句中的一些代码时。

似乎我的应用程序首先执行(可能它在后台调用了一些非托管代码,这就是它不停止的原因)

所以最大的问题是:如果有多个线程,如何卸载 AppDomain?

我只看到两个选项:

  • 尝试中止我的线程,然后以某种方式重新检查线程的状态。如果它们已停止,那么我可以调用 AppDomain.Unload - 它不应引发异常。
  • 另一种方法是简单地调用 AppDomain.Unload。可能会抛出异常。然后我可以捕获这个异常并重试卸载。由于 AppDomain.Unload 尝试中止所有受影响的线程,可能重试几次就足够了。

这两种解决方案都使用了一些看起来很老套的重试机制。

在 .NET 中是否有一些更简单、更可靠的方法来执行此操作?

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