【发布时间】:2015-07-09 15:47:39
【问题描述】:
我正在尝试卸载 AppDomain 并收到 CannotUnloadAppDomainException。
MSDN 提到了可能引发此异常的 3 个原因:
- 默认应用程序域,在应用程序的生命周期内必须保持加载状态。
- 具有无法立即停止执行的正在运行线程的应用程序域。
- 已卸载的应用程序域。
我的应用程序遇到了案例 2)。
它有一些后台线程 - 例如,我有一个搜索索引线程运行它自己的 Dispatcher。
据我所知,当我打电话时
AppDomain.Unload(subDomain);
那么受影响域中的所有线程都会得到一个ThreadAbortException。
理想情况下,这意味着所有线程都被“杀死”/停止,对吧?
两种情况除外:
- 当线程调用一些托管代码时 - 运气不好...
- 当线程在 finally 语句中执行某些代码时。
我的应用程序似乎是第一个(可能它在后台调用了一些非托管代码,这就是它没有停止的原因)
所以最大的问题是:如果 AppDomain 有多个线程,如何卸载它?
我只看到两个选项:
- 尝试中止我的线程,然后以某种方式重新检查线程的状态。如果它们被停止,那么我可以调用
AppDomain.Unload- 它不应该引发异常。 - 另一种选择是直接调用
AppDomain.Unload。可能它会抛出异常。然后我可以捕捉到这个异常并重试卸载。由于AppDomain.Unload会尝试中止所有受影响的线程,因此可能重试几次就足够了。
这两种解决方案都使用了一些重试机制,这似乎是 hackish。
在 .NET 中没有更简单、更可靠的方法吗?
【问题讨论】:
标签: c# .net multithreading appdomain threadabortexception