Windowsサービスでこのエラーが発生します。 これはhereappdomainをアンロード中にエラーが発生しました。 (HRESULTからの例外:0x80131015)、Windowsサービス内
コードは(これは3.5のWindowsサービスであるように私自身のバージョン)Parallel.ForEach
を使用するように改訂され、私は以前に私の質問で説明したのと同じサービスです。 Parallelを使用する理由は、各ドメインをアンロードするのに時間がかかり過ぎるため、パラレルで実行するほうが速くなるはずです(各Unloadを実行するスレッドが1つしかないように見えます)。
他の記事に基づいて、私はこれだけがダウンして、私はThreadPool
Thread
Unload
にAppDomain
Sを使用しています実際に何らかの形であることを推測することができます。私はそれを避ける方法を見ることができません?
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ごとに1つのバックグラウンドタスクではなく、1つのバックグラウンドタスクですべてのAppDomainsをアンロードしようとしましたか? –
@PanosRontogiannis問題は、単一のバックグラウンドスレッドで実行したときに 'OnStop'が実行するのに時間がかかりすぎたという問題でした。問題について何らかの疑念を持って調査中。 –