1

私が取り組んでいるシステムは、作業項目の IEnumerable を消費し、それらのそれぞれを反復処理し、それらの間で一定期間待機する必要があります。集計現場のシステムはできるだけシンプルにしたい。つまり、指定した特定の時間ブロックする foreach ブロックの最後に呼び出すことができるメソッドが必要ですが、保証することが不可能であるため、 Thread.Sleep を使用したくありません精度。

ブロックする必要がある最小時間は 100 ミリ秒ですが、これより長くブロックしたくありません。これは、Thread.Sleep が時々行うのを見たことがあります (状況に応じて時間がかかるためだと思います)。スイッチなど)。

編集:関連。タイムアウト値を指定した WaitHandle.Wait の呼び出しは、Thread.Sleep と同じことを行いますか?

4

2 に答える 2

3

Thread.Sleep() の精度は約 20 ミリ秒です。ギブ オア テイクです。(管理されていない) マルチメディア タイマーに行かなければ、何も改善されません。そして、あなたはやり過ぎと思われる少しだけ一時停止しているので. Sleep(80) を試してください。

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

于 2009-08-24T14:00:17.923 に答える
2

列挙中に正確に待機する必要があるのはなぜですか?

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

それを考えると、なぜ人為的な遅延ですか?それをそのまま消費し、スケジューラーがスレッド間で作業を分散できるようにします。

本当に正確な待ち時間が必要な場合は、 Thread.Sleep(time - 20 ms) を使用してから、適切な時間を待って仕事をすることをお勧めします。

このような精度を実現できるのは、リアルタイム オペレーティング システムだけです。Thread.Sleep の精度は約 20 ミリ秒であると想定できるため、理論的には目的の時間までスリープすることができます。実際の時間は約 20 ミリ秒で、その後 20 ミリ秒スピンしますが、その 20 ミリ秒を無駄にする必要があります。それでも、リアルタイムの結果が得られるとは限りません。スケジューラーは、関連する部分を実行しようとしていたときにスレッドを削除する可能性があります (スピンした直後)。

于 2009-08-24T14:05:36.827 に答える