2009-08-24 15 views
1

私が作業しているシステムでは、作業項目のIEnumerableを消費し、それぞれの作業を繰り返し、その間にある一定の期間待つ必要があります。列挙サイトでシステムをできるだけシンプルにしたいと思います。つまり、私は指定した特定の時間をブロックするforeachブロックの最後に呼び出すことができるメソッドを用意したいと思いますが、Thread.Sleepを使用したくないのは保証できないためです精度。特定の期間スレッドをブロックする正確な方法は何ですか?

ブロックする必要がある最小時間は100msですが、これ以上ブロックしないようにしていますが、これは私がThread.Sleepを機会に行うのを見てきました(私はコンテキストスイッチで取られた時間など)。

編集:関連;タイムアウト値でWaitHandle.Waitを呼び出すと、Thread.Sleepと同じことが起こりますか?

答えて

2

なぜenumaratingしている間、正確に待つ必要がありますか?

IEnumerableコレクションが変更されたときに例外が発生するため、スレッドが作業中に他のスレッドによってアイテムが追加または削除されることはありません。

これを考えると、なぜ人工的な遅延ですか?スケジューラーがあなたのスレッド間で作業を配布できるように、それを消費してください。

本当に正確な待機時間が必要な場合は、Thread.Sleep(時間 - 20 ms)を使用して、適切な時間を待つことをお勧めします。

リアルタイムオペレーティングシステムでのみ、このような精度が得られます。 Thread.Sleepは約20msの精度を持っていると仮定することができます。理論的には希望の時間までスリープできます。実際の時間は約20msです。それから20ms間スピンしますが、20msを無駄にする必要があります。そして、それでもリアルタイム結果が得られるとは限りません。スケジューラーは関連する部分を実行しようとしていた直後(スレッドの回転直後)にスレッドを取り出すかもしれません。

+0

"active wait"? –

+0

Btw - 私は本当に本当に私が求めていることをしたい。 =) –

+0

あなたは決して知りません:)アクティブ待ちはスペイン語で知られている方法である "espera activa"の非常に悪い翻訳です:P ... "Busy Wait"に修正されました –

3

Thread.Sleep()は、約20msの精度を持ちます。あなたは、(管理されていない)マルチメディアタイマーに行かなくても、何の改善も得られません。あなたが過度のように思える嘘を一時停止しているからです。スリープ(80)を試してください。

追加:すべてのタイムアウト値は、わかっている限り、Sleep()と同じ解像度です。

関連する問題