When calling BlockingCollection.Take() it is possible for the IsCompleted status of the collection to change between the check of IsCompleted and the call to Take().
The MSDN Documentation that shows an example just catches the invalid operation exception, but it seems like there must be a proper way to do such a call without catching the exception (since this incurs a decent amount of overhead and doesn't look clean in code). What is the proper way to call .Take() and to avoid an invalid operation exception?
A simplified version of my specific issue:
If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take(); //Throws Exception, IsCompleted = True;
}
开发者_如何转开发There is a TryTake method available, but I am under the impression that it is so that a timeout and cancelation token can be passed in, not to deal with the IsCompleted becoming true in between the time it is checked and when Take() is called.
You can use the TryTake overload with no timeout/cancelation. It will return false if the BlockingCollection
is empty or has been marked completed, and handles the synchronization issue you're facing correctly.
精彩评论