質問

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

このタイマーの制御におけるタイマーの動作方法は別のスレッドに置かれるため、親スレッドがビジーでないときは、親スレッドでの作業の完了に合わせて常にタイマーを動作させることができます。

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

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

役に立ちましたか?

解決

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top