2012-04-04 69 views
33

ConcurrentQueueBlockingCollectionの違いは何ですか?.NETのConcurrentQueueとBlockingCollectionの違いは何ですか?

なぜBlockingCollectionは、ConcurrentQueueで実行できる場合、プロデューサ - コンシューマの操作に最適ですか?次のコードで何か改善する必要がありますか?

MessageSlotMachineGameStartOrAndStatusUpdate msg; 

while (!aCancellationToken.IsCancellationRequested) 
{ 
    try 
    { 
     this.isStillConsumingMsg = true; 
     Boolean takeResult = this.msgQueue.TryTake(out msg, this.msgConsumeTimeOut, aCancellationToken); 
     if (takeResult) 
     { 
      if (msg != null) 
      { 
       this.ProcessMessage(msg); 
      } 
     } 
     else 
     { 
      break; 
     } 
    } 
    catch (OperationCanceledException err) 
    { 
     EngineManager.AddExceptionLog(err, "Signal Operation Canceled"); 
    } 
    catch (Exception err) 
    { 
     EngineManager.AddExceptionLog(err, "Signal exception"); 
    } 
    finally 
    { 
     this.isStillConsumingMsg = false; 
    } 
} 

答えて

35

BlockingCollection取るために何もない場合は、消費者をブロックして、アイテムを提供するために、生産者側のを待つだろうTake方法があります。 ConcurrentQueueにはそのようなメソッドがありません。空の場合、コンシューマーは待機を処理する必要があり、プロデューサーは空でない通知を提供する必要があります。

+0

通知を行う方法のサンプルを教えてください。 –

+1

@WAPGuy ['AutoResetEvent'](http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx)を使用することができます。リンクをたどって、それがどのように使用されているかの例を下にスクロールします。 – dasblinkenlight

+0

WaitHandleに信号を送るとOKですか?それが空であるか、またはTakeメソッドで与えられたタイムアウトの後すぐに? –

関連する問題