6

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

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

根据其他帖子,我只能猜测这在某种程度上归结于我使用 aThreadPool Thread到sUnload的事实。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);
    }
}
4

2 回答 2

6

我将此作为错误追踪到AppDomain退出等待从未设置的 WaitHandle 的 s 之一。

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

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

于 2012-11-15T13:04:06.653 回答
1

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

于 2012-11-15T12:59:23.767 回答