Я наконец понял, что, как показывает этот SO post , я получил ложное из TryTake
, потому что коллекция была очищена, а также помечена мной как завершенная (вызвав метод CompleteAdding()
дляколлекция).
Итак, чтобы решить эту проблему, я добавил условие к завершенному флагу.
Можно утверждать, что TryTake
никогда не вернет false в то время как установленный флаг равен false .Я не уверен, что это всегда правильно, поэтому я предпочитаю выдавать ошибку в этом случае.
public T TryTake(int timeoutMiliseconds)
{
var result = default(T);
if (!_collection.TryTake(out result, timeoutMiliseconds)
&& !_collection.IsAddingCompleted)
{
throw new InvalidOperationException("Unable to get item from collection.");
}
return result;
}
Обратите внимание, что крайне важно сначала поставить вызов TryTake
, а затем IsAddingCompleted
.В противном случае первое условие может пройти, и вы сразу заблокируете TryTake
.