gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:28:48 27 4
gpt4 key购买 nike

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com