14

長時間スリープする必要がある Windows サービスを作成しています (15 時間が最長で、30 分が最短です)。現在、Thread.Sleep(calculatedTime)を使用してコードをスリープ モードにしています。Thread.Sleep は最適なオプションですか、それともタイマーを使用する必要がありますか? 私はこれをしばらくグーグルで調べてきましたが、簡潔な答えが見つかりません。これはwindowsサービスなのでUIがロックされる心配がないので、Thread.Sleepを使わない理由が思いつきません。

任意の洞察をいただければ幸いです。

4

5 に答える 5

20

タイマー Thread.Sleep を使用すると、サービスのシャットダウンを妨げるブロッキング ピースが発生する可能性があります。

間隔が広くて規則的である場合は、スケジュールを設定することもできます。ただし、長くて一貫性のない間隔について話している場合は、はい、タイマーの方が適しています。

于 2009-06-15T20:17:11.703 に答える
10

サービスはサービス コントロール マネージャーによっていつでも停止するように求められる可能性があるため、スレッドは常にこれらの要求に応答する準備ができている必要があるため、Thread.Sleep() は使用しないでください。代わりに、メイン スレッドで手動リセット イベントを作成し、その WaitOne メソッドをワーカー スレッドでタイムアウト付きで使用します。時間切れになると、WaitOne は false を返します。

サービス クラスの OnStop または OnShutdown メソッドが呼び出されたときにイベントを設定すると、WaitOne が true を返すようになり、ワーカー スレッドを終了できます。

于 2009-06-15T20:40:01.167 に答える
7

Thread.Sleep()一般に、多くの場合に使用するのは悪い習慣と見なされています。

サービスをバックグラウンドで実行する場合は、タイマーを使用する必要があります。

サービスをスケジュールされた間隔でのみ実行する必要がある場合は、Windows タスク スケジューラを使用して、必要なときに Windows がアプリケーションを実行できるようにすることをお勧めします。

于 2009-06-15T20:18:53.803 に答える
6

そのような大量の時間を事前に計算して、何時間も寝るべきではありません。せいぜい1分間寝てから、目を覚まして時間を再計算し、1分以内でもう一度寝ます。計算が非常に安いか、キャッシングで非常に安くできると思います。私のアドバイスが軽減しようとしている問題は、コンピューターの時計が驚くほど「不安定」であることです。これは主に、ネットワーク タイム サービスによって修正された時間のずれ、夏時間、特にユーザーが時計を調整しているためです。そのため、1 分ごとに目を覚ますことを意味する場合でも、このような長い間隔の時間を常に再計算することをお勧めします。驚かないでください (つまり、主張しないでください)。「過去」に目覚めたとしても、時計は時間を戻すことができます。

于 2009-06-15T20:28:39.697 に答える
1

考慮すべきもう 1 つの点は、スレッドは有限のリソースであり、各スレッドはそのスタック用にメモリの一部 (1MB?) を消費することです。また、スケジューラの負荷も増加する可能性があります。

ここで、サービスが他に多くのことを行っていない場合、無駄なスペースは些細なことですが、複数のスレッドの割り当てを開始する前に、このことを認識しておくことが賢明です。ThreadPool や Timers を使用すると、はるかに効率的です。

于 2009-06-15T20:29:11.097 に答える