2012-04-04 28 views
33

.NET ConcurrentQueue ve BlockingCollection arasındaki farklar nelerdir?.Net'de ConcurrentQueue ve BlockingCollection arasındaki farklar nelerdir?

BlockingCollection üretici-tüketici işlemi için en iyisi ConcurrentQueue yoluyla yapılabilir Neden? Aşağıdaki kodda herhangi bir şeyi geliştirmek zorunda mıyım?

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

cevap

35

BlockingCollection almak ve bir öğe sağlamak için bir yapımcı tarafı için beklemek hiçbir şey varsa tüketiciyi bloke edecek bir Take yöntemi vardır. ConcurrentQueue böyle bir yöntemden yoksundur - eğer boşsa, tüketicinin beklemeyi yerine getirmesi gerekir ve üreticinin boş olmayan bir bildirim sağlaması gerekir.

+0

Bana bildirim yapılabilir nasıl örnek verebiliriz. –

+1

Bir [ 'AutoResetEvent'] (http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx) kullanabilir @WAPGuy. Bağlantıyı takip edin ve nasıl kullanıldığına dair bir örnek için aşağı kaydırın. – dasblinkenlight

+0

Tamam, WaitHandle'ye sinyal gönderdiğinde? Boş olduğunda veya Take yönteminde bir zaman aşımı sonrasında mı? –

İlgili konular