88


2

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

.NETには、3種類のタイマーがあります(_http://msdn.microsoft.com/ja-jp/magazine/cc164015.aspxを参照)。 .NET Frameworkクラスライブラリ内のタイマークラスの比較]])。 メインスレッドがビジーの場合に他のタイプがドリフトする可能性があるので、私はスレッドタイマーを選択しました。そして、これを信頼できるものにする必要があります。

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

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

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

2 Answer


53


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


19


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