キューにアイテムがない場合、ConcurrentQueue の TryDequeue は false を返します。
キューが空の場合、新しいアイテムがキューに追加されるまでキューが待機し、その新しいアイテムをデキューする必要があり、プロセスはそのように続行されます。
C# 4.0でmonitor.enter、wait、pulse、またはその他のより良いオプションを使用する必要がありますか?
キューにアイテムがない場合、ConcurrentQueue の TryDequeue は false を返します。
キューが空の場合、新しいアイテムがキューに追加されるまでキューが待機し、その新しいアイテムをデキューする必要があり、プロセスはそのように続行されます。
C# 4.0でmonitor.enter、wait、pulse、またはその他のより良いオプションを使用する必要がありますか?
これは、 BlockingCollectionが設計された目的ではありませんか?
私が理解しているように、これらのいずれかで ConcurrentQueue をラップしてから、Takeを呼び出すことができます。
キュー内の要素の数を定期的に確認し、要素の数が 0 より大きい場合は、ManualResetEvent などを使用して、キューが空になるまで要素をデキューするスレッドにシグナルを送信します。
このための擬似コードは次のとおりです。
チェックスレッド:
while(true)
{
int QueueLength = 0;
lock(Queue)
{
queueLength = Queue.Length;
}
if (Queue.Length > 0)
{
manualResetEvent.Set();
}
else
{
Thread.Sleep(...);
}
}
デキュー スレッド:
while(true)
{
if(manualResetEvent.WaitOne(timeout))
{
DequeueUntilQueueEmpty();
}
}
DequeueUntilQueueEmpty でのロックの使用も検討してください。