[英]What is the proper way to take an item from a BlockingCollection?
調用BlockingCollection.Take()時,集合的IsCompleted狀態可能會在IsCompleted檢查和Take()調用之間發生變化。
顯示示例的MSDN文檔只捕獲無效操作異常,但似乎必須有一種正確的方法來執行此類調用而不捕獲異常(因為這會產生相當大的開銷並且在代碼中看起來不干凈)。 調用.Take()和避免無效操作異常的正確方法是什么?
我特定問題的簡化版本:
If (!blockingCollection.IsCompleted)
{
//do some stuff
value = blockingCollection.Take(); //Throws Exception, IsCompleted = True;
}
有一個TryTake方法可用,但我的印象是它可以傳入超時和取消令牌,而不是處理IsCompleted在檢查時和調用Take()之間變為true 。
您可以使用TryTake重載而不會超時/取消 。 如果BlockingCollection
為空或已標記為已完成,它將返回false,並處理您正確面對的同步問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.