ルーチンが を介して定期的に実行されてSystem.Threading.Timer
いる場合、ホスト アプリケーションの終了によってこのルーチンが途中で中止されないようにするにはどうすればよいですか?
3 に答える
このコードにより、メイン スレッドが 10 秒間ブロックされ、キューに入れられたタイマー コールバックが終了するのを待機します。これは、ホスト アプリケーションの終了ポイントで実行できます。
Dim waitHnd As WaitHandle = New AutoResetEvent(False)
Timer1.Dispose(waitHnd)
waitHnd.WaitOne(10000)
アプリケーションが終了している場合は、おそらく何もできません。ただし、非バックグラウンド スレッドを開いた場合は、終了 (メイン ウィンドウを閉じるなど) することで、暗黙的なアプリケーションの終了を防ぐことができます。main
System.Threading.Timer
タイマーをそのスレッドで実行することはできますが、スレッド プール スレッド (バックグラウンド スレッド) で実行されるため、 では実行できません。たとえば、そのスレッドでディスパッチャを開始し、DispatcherTimer
(WPF を使用している場合) を実行できます。
スレッドが異常終了しないことを保証する方法はありません。予想外の電源障害、ユーザーがタスク マネージャーでアプリケーションを終了する、スレッドをクラッシュさせるプログラムのバグなど、さまざまな問題が発生する可能性があります。
中断された場合にデータベースが破損したり一貫性のない状態のままになる多段階のデータベース更新を行っている場合は、トランザクションを使用する必要があります。