私はThread.Join(int millisecondsTimeout)いくつかのを終了するために使用していますAppDomain。
AppDomain が 5 秒以内に終了しなかったというエラー メッセージが頻繁に表示されます。デバッガーをステップ実行すると、AppDomain.Unload()呼び出しが 5 秒以内に簡単に終了することがわかりますが、 Thread.Joinfalse が返されます。
どこが間違っていますか?
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終了する前にキューが完全に排出されることを確認しています。
Timertick メソッド内にある場合、すべての がログに記録されます。したがって、タイマー キューに何もないことはほぼ確実であり、_timer.Dispose(_timerWaitHandle)すぐに戻ります。
できるかどうかに関係なく、私が行っている 3 つの s のうち少なくとも1 つが5 秒以内に完了しません。AppDomainUnload