При вызове BlockingCollection.Take () возможно изменение состояния IsCompleted коллекции между проверкой IsCompleted и вызовом Take ().
Документация MSDN , в которой показан пример, просто перехватывает исключение недопустимой операции, но кажется, что должен быть правильный способ сделать такой вызов без перехвата исключения (поскольку это влечет за собой приличное количество накладных расходов и не выглядит чистым в коде). Как правильно вызвать .Take () и избежать исключения недопустимой операции?
Упрощенная версия моей конкретной проблемы:
If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take(); //Throws Exception, IsCompleted = True;
}
Существует метод TryTake, но у меня сложилось впечатление, что это так что токен тайм-аута и отмены может быть передан, чтобы не иметь дело с IsCompleted, становящимся истиной между временем его проверки и вызовом Take ().