2008-08-01 13 views
75

.NETには、3種類のタイマータイプがあります(Comparing the Timer Classes in the .NET Framework Class Libraryを参照)。メインスレッドがビジーであれば、他のタイプのドリフトが発生する可能性があるため、スレッドタイマーを選択しました。これを信頼できるものにする必要があります。コンソールアプリケーションの信頼できるタイマー

タイマーの制御でこのタイマーが動作する方法は、別のスレッドに置かれるため、ビジーでないときに親スレッドで完了した作業開始とともに常にチェックすることができます。

コンソールアプリケーションでのこのタイマーの問題は、タイマーが別のスレッドで進んでいる間、メインスレッドがアプリケーションを終了させるために何もしないことです。

ループにwhile trueループを追加しようとしましたが、タイマーがオフになったときにメインスレッドがビジー状態です。

答えて

48

Console.ReadLine()のようなものを使用してメインスレッドをブロックすることができるので、他のバックグラウンドスレッド(タイマースレッドなど)は引き続き動作します。 AutoResetEventを使用して実行をブロックし、必要なときにそのAutoResetEventオブジェクトでSet()メソッドを呼び出してメインスレッドを解放することもできます。また、Timerオブジェクトへの参照がスコープから外れてガベージコレクトされないようにしてください。

15

ManualResetEventを使用して、処理の最後にメインスレッドをブロックし、タイマーの処理が完了したらReset()を呼び出してください。これが絶え間なく動作する必要がある場合は、これをコンソールアプリケーションではなくサービスプロセスに移行することを検討してください。

関連する問題