Как правильно взять элемент из BlockingCollection?

При вызове BlockingCollection.Take () возможно изменение состояния IsCompleted коллекции между проверкой IsCompleted и вызовом Take ().

Документация MSDN , в которой показан пример, просто перехватывает исключение недопустимой операции, но кажется, что должен быть правильный способ сделать такой вызов без перехвата исключения (поскольку это влечет за собой приличное количество накладных расходов и не выглядит чистым в коде). Как правильно вызвать .Take () и избежать исключения недопустимой операции?

Упрощенная версия моей конкретной проблемы:

If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take();  //Throws Exception, IsCompleted = True;
}

Существует метод TryTake, но у меня сложилось впечатление, что это так что токен тайм-аута и отмены может быть передан, чтобы не иметь дело с IsCompleted, становящимся истиной между временем его проверки и вызовом Take ().

14
задан Tim Lloyd 18 August 2011 в 17:14
поделиться