我在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}}
答案 0 :(得分:6)
我在退出时将其作为一个错误追踪到AppDomain
之一,等待一个从未设置过的WaitHandle。
如果线程没有中止,例如因为它正在执行 非托管代码,或者因为它正在执行finally块,然后是 在一段时间内抛出一个CannotUnloadAppDomainException 最初调用Unload的线程。
AppDomain
现在卸载速度相对较快,我的服务很快停止。
答案 1 :(得分:1)
尝试在单个后台任务中卸载所有AppDomain,而不是为每个AppDomain卸载一个后台任务,并使用ServiceBase.RequestAdditionalTime,以便SCM不会将您的服务标记为无响应。