c# - 卸载应用程序域时出错。 (Windows 服务中的 HRESULT : 0x80131015), 异常

标签 c# exception appdomain

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

修改代码以使用 Parallel.ForEach(我自己的版本,因为这是一个 3.5 windows 服务)。并行使用的原因是卸载每个域花费的时间太长,并行运行它们应该会更快(似乎即使只有一个线程在执行每个卸载?!)。

根据其他帖子,我只能猜测这是因为我正在使用 ThreadPool ThreadUnload 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);
    }
}

最佳答案

我追踪到这是一个 AppDomain 在退出时等待从未设置的 WaitHandle 的错误。

If a thread does not abort, for example because it is executing unmanaged code, or because it is executing a finally block, then after a period of time a CannotUnloadAppDomainException is thrown in the thread that originally called Unload.

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

关于c# - 卸载应用程序域时出错。 (Windows 服务中的 HRESULT : 0x80131015), 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13365467/

相关文章:

AuthorizeAttribute 上的 C# 线程安全 CreateIdentityAsync

c# - 基于 <T> 类型在运行时动态创建 lambda 谓词

python - 如何防止多次捕获异常

cakephp 3 中的 JSON 异常

java - 什么是堆栈溢出错误?

c# - 关闭 AppDomain 及其创建的所有 AppDomain

c# - 随时间旋转游戏对象

c# - 如何定义实体的填充方式?

c# - 消息泵和 AppDomains

c# - 将不同版本的程序集加载到单独的 AppDomain 中