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