29

キューにアイテムがない場合、ConcurrentQueue の TryDequeue は false を返します。

キューが空の場合、新しいアイテムがキューに追加されるまでキューが待機し、その新しいアイテムをデキューする必要があり、プロセスはそのように続行されます。

C# 4.0でmonitor.enter、wait、pulse、またはその他のより良いオプションを使用する必要がありますか?

4

3 に答える 3

51

これは、 BlockingCollectionが設計された目的ではありませんか?

私が理解しているように、これらのいずれかで ConcurrentQueue をラップしてから、Takeを呼び出すことができます。

于 2011-02-16T08:45:25.727 に答える
-1

キュー内の要素の数を定期的に確認し、要素の数が 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 でのロックの使用も検討してください。

于 2011-02-16T08:41:24.330 に答える