2012-04-04 18 views
33

Quali sono le differenze tra ConcurrentQueue e BlockingCollection in .Net?Quali sono le differenze tra ConcurrentQueue e BlockingCollection in .Net?

Perché BlockingCollection è la soluzione migliore per le operazioni produttore-consumatore quando può essere eseguita tramite ConcurrentQueue? Devo migliorare qualcosa nel seguente codice?

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; 
    } 
} 

risposta

35

BlockingCollection ha un metodo Take che bloccano il consumatore se non c'è nulla da prendere, e attendere un lato produttore di fornire un elemento. ConcurrentQueue manca di tale metodo - se è vuoto, il consumatore dovrebbe gestire l'attesa e il produttore dovrebbe fornire una notifica non vuota.

+0

puoi darmi un esempio di come la notifica può essere fatta. –

+1

@WAPGuy È possibile utilizzare un ['AutoResetEvent'] (http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx). Segui il link e scorri verso il basso per un esempio di come viene utilizzato. – dasblinkenlight

+0

ok, quando segnala a WaitHandle? immediatamente quando è vuoto o dopo un timeout indicato sul metodo Take? –

Problemi correlati