質問
私はそれを知っています 。ネット タイマーには 3 つのタイプがあります (「 .NET Framework クラス ライブラリのタイマー クラスの比較)。他のタイプのタイマーはメインスレッドがビジー状態の場合にドリフトする可能性があり、これを信頼できるものにする必要があるため、スレッドタイマーを選択しました。
このタイマーの制御におけるタイマーの動作方法は別のスレッドに置かれるため、親スレッドがビジーでないときは、親スレッドでの作業の完了に合わせて常にタイマーを動作させることができます。
コンソール アプリケーションにおけるこのタイマーの問題は、タイマーが別のスレッドで動作している間、メイン スレッドはアプリケーションを閉じるために何も行わないことです。
を追加してみました while true
ループしますが、タイマーが鳴るとメインスレッドはビジー状態になります。
解決
次のようなものを使用できます Console.ReadLine()
メインスレッドをブロックして、他のバックグラウンドスレッド (タイマースレッドなど) が引き続き動作できるようにします。を使用することもできます。 自動リセットイベント 実行をブロックするには、(必要なときに) AutoResetEvent オブジェクトの Set() メソッドを呼び出して、メイン スレッドを解放します。また、Timer オブジェクトへの参照がスコープ外に出たりガベージ コレクションされたりしないようにしてください。
他のヒント
の使用を検討してください。 手動リセットイベント 処理の最後にメインスレッドをブロックし、 Reset()
タイマーの処理が完了したら、オンにします。これを常に実行する必要がある場合は、これをコンソール アプリではなくサービス プロセスに移動することを検討してください。