41

Вопрос по c#-4.0, generics, .net – Каковы различия между ConcurrentQueue и BlockingCollection в .Net?

Каковы различия междуConcurrentQueue а такжеBlockingCollection в .Net?

Зачем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;
    }
}
  • спасибо! @dasblinkenlight

    от WAP Guy
  • хорошо, когда он подает сигнал WaitHandle? сразу, когда он пуст или после тайм-аута, указанного в методе Take?

    от WAP Guy
  • @WAPGuy Вы можете использоватьAutoResetEvent, Перейдите по ссылке и прокрутите вниз, чтобы увидеть пример ее использования.

    от
  • @ WAPGuy Это сигнал сразу. Тайм-аут тайм-аута предназначен для того, чтобы при отсутствии сигнала в течение данного тайм-аута метод не зависал вечно.

    от
  • Можете ли вы дать мне пример того, как можно сделать уведомление.

    от WAP Guy
  • BlockingCollection использует CurrentQueue в качестве базового типа для хранения данных. Плюс у этого есть функциональность блокировки.

    от Brain2000
  • 43

    BlockingCollection имеетTake метод, который блокирует потребителя, если нечего взять, и ждет, пока сторона производителя предоставит товар.ConcurrentQueue отсутствует такой метод - если он пуст, потребителю потребуется обработать ожидание, а производителю потребуется предоставить непустое уведомление.