は10000msスピンウェイトvsスリープ待ち。どちらを使うの?
または
のタイムアウトの
SpinWait.SpinUntil(() => myPredicate(), 10000)
にそれが効率的です例えば同じ条件 ために、次のSleepWait
の線に沿って何かをThread.Sleep
ポーリングを使用することがより効率的です関数:
public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}
私たちが1秒以上のタイムアウトについて話しているならば、SpinWaitのすべての利回りは良い使用パターンではないかもしれないと思いましたか?これは正当な仮定ですか?
あなたが好きですアプローチとなぜですか?もっと良いアプローチがありますか?
更新 - 複数の特定目指して:
は、それが有界容量に達したときにBlockingCollectionが眠っているスレッドをパルスにする方法はありますか? Marc Gravelが示唆するように、私はむしろ忙しい待ち時間を避けます。
ありがとうございます、私はあなたの答えが好きです、これは確かにいいです。 BlockingCollectionを介していくつかのリソースの使用状況を追跡しているとします。それらは再利用のために再び利用可能になったときに使用され(そしてコレクションから削除され)、コレクションに戻されます。シャットダウンは、これらすべてがコレクションに戻った場合にのみ発生します。忙しい待っている以外のシャットダウンが進む(つまり、コレクションがいっぱいになった)ことを知らせる方法はありますか? – Anastasiosyal
@Anastasiosyal私はコレクションをカプセル化し、完全なときにラッパーに何かをさせるでしょう。実際には、私はおそらくこのために 'Monitor'を使うでしょう(例を追加します) –
BlockingQueueを継承する 'ObjectPool'クラスのデストラクタで、BlockingCollectionからすべてのオブジェクトを1つずつポップして破棄します。これはC#であるため、取り出されたオブジェクトの数がプールの深さと等しくなるまで、取得した参照をnilに設定します)。すべてのプールされたオブジェクトが破棄されたので、キューを廃棄してdtorから戻ってシャットダウンシーケンスを続行できます。ポーリング/ビジーウェイトは必要ありません!リークしたオブジェクトが最終的に例外(または何か)を発生させるように、テイクをタイムアウトにしたいかもしれません。 –