卸载appdomain时出错。 (来自HRESULT的异常:0x80131015),在Windows服务中

时间:2012-11-13 17:17:38

标签: c# exception appdomain

我在Windows服务中收到此错误。 这与我之前在我的问题here

中讨论过的服务相同

代码修改为使用Parallel.ForEach(我自己的版本,因为这是一个3.5 Windows服务)。并行使用的原因在于,卸载每个域只需要太长时间并且并行运行它们应该被证明更快(即使只有一个线程正在执行每次卸载?!)。

根据其他帖子,我只能猜测这是因为我使用ThreadPool Thread Unload AppDomain public partial class SomeService : ServiceBase { private Manager _appDomainManager; protected override void OnStop() { _appDomainManager.Dispose(); } } public class Manager : IDisposable { public void Dispose() { Log.Debug("Disposing"); Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_disposed) return; if (disposing) { // dispose managed resources Parallel.For(0, appdomains.Length, UnloadAppDomian); } _disposed = true; } } private UnloadAppDomain(int appDomainIndex); public static class Parallel35 { public static void For(int start, int end, Action<int> action) { var waitHandles = new WaitHandle[end - start]; for (int j = 0; j < waitHandles.Length; j++) { waitHandles[j] = new ManualResetEvent(false); } for (int i = start; i < end; i++) { int i1 = i - start; ThreadPool.QueueUserWorkItem( state => { try { action((int) state); } finally { ((ManualResetEvent) waitHandles[i1]).Set(); } }, i); } WaitHandle.WaitAll(waitHandles); } } s。我只是看不出如何避免它?

{{1}}

2 个答案:

答案 0 :(得分:6)

我在退出时将其作为一个错误追踪到AppDomain之一,等待一个从未设置过的WaitHandle。

  

如果线程没有中止,例如因为它正在执行   非托管代码,或者因为它正在执行finally块,然后是   在一段时间内抛出一个CannotUnloadAppDomainException   最初调用Unload的线程。

AppDomain现在卸载速度相对较快,我的服务很快停止。

答案 1 :(得分:1)

尝试在单个后台任务中卸载所有AppDomain,而不是为每个AppDomain卸载一个后台任务,并使用ServiceBase.RequestAdditionalTime,以便SCM不会将您的服务标记为无响应。