私はThread.Join(int millisecondsTimeout)
いくつかのを終了するために使用していますAppDomain
。
AppDomain が 5 秒以内に終了しなかったというエラー メッセージが頻繁に表示されます。デバッガーをステップ実行すると、AppDomain.Unload()
呼び出しが 5 秒以内に簡単に終了することがわかりますが、 Thread.Join
false が返されます。
どこが間違っていますか?
var thread = new Thread(
() =>
{
try
{
AppDomain.Unload(someAppDomain);
}
catch (ArgumentNullException)
{
}
catch (CannotUnloadAppDomainException exception)
{
// Some error message
}
});
thread.Start();
const int numSecondsWait = 5;
if (!thread.Join(1000 * numSecondsWait))
{
// Some error message about it not exiting in 5 seconds
}
編集 1
それぞれの機能を追加する価値がAppDomain
あります。それぞれAppDomain
に少なくとも 1 つの がありTimer
ます。コードは大まかに次のようになります (読みやすくするために、ここでは多数のクラスを 1 つにまとめていることに注意してください)。
static void Main(string[] args)
{
_exceptionThrown = new EventWaitHandle(false, EventResetMode.AutoReset);
_timer = new Timer(TickAction, null, 0, interval);
try
{
_exceptionThrown.WaitOne();
}
finally
{
_timer.Dispose(_timerWaitHandle);
WaitHandle.WaitAll(_timerWaitHandle);
}
}
実際には、「メイン」スレッドが をスローThreadAbortException
し、finally ステートメントにジャンプし、Timer
終了する前にキューが完全に排出されることを確認しています。
Timer
tick メソッド内にある場合、すべての がログに記録されます。したがって、タイマー キューに何もないことはほぼ確実であり、_timer.Dispose(_timerWaitHandle)
すぐに戻ります。
できるかどうかに関係なく、私が行っている 3 つの s のうち少なくとも1 つが5 秒以内に完了しません。AppDomain
Unload