簡體   English   中英

從BlockingCollection中獲取項目的正確方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM