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

M A*_*ifi 6 c# exception appdomain

我在Windows服务中收到此错误.这是我以前在我的问题讨论同样的服务在这里

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

基于其他职位,我只能猜测,这是不知何故下来我用一个事实ThreadPool ThreadUnloadAppDomain秒.我只是看不出如何避免它?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

M A*_*ifi 6

我将其作为一个错误追踪到其中一个AppDomain出口处,等待一个从未设置过的WaitHandle.

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

AppDomain现在卸载比较快,我的服务很快停止.

  • @David A. Gray 你能分享一下你的解决方案吗? (2认同)