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;
}
}
puoi darmi un esempio di come la notifica può essere fatta. –
@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
ok, quando segnala a WaitHandle? immediatamente quando è vuoto o dopo un timeout indicato sul metodo Take? –