コンソールアプリケーションの信頼できるタイマー


102

.NETには3つのタイマータイプがあることを知っています.NET Frameworkクラスライブラリのタイマークラスの比較を参照)。メインスレッドがビジーの場合に他のタイプがドリフトする可能性があるため、スレッドタイマーを選択しました。これには信頼性が必要です。

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

コンソールアプリケーションでのこのタイマーの問題は、タイマーが別のスレッドで進んでいる間、メインスレッドがアプリケーションに対して何も実行しておらず、閉じることです。

while trueループを追加してみましたが、タイマーが切れるとメインスレッドがビジー状態になります。

回答:


59

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


20

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.