如何從BlockingCollection中刪除項目?以下哪項是正確的?從BlockingCollection中刪除項目
myBlockingCollection.Remove(Item);
或
myBlockingCollection.Take(Item);
如何從BlockingCollection中刪除項目?以下哪項是正確的?從BlockingCollection中刪除項目
myBlockingCollection.Remove(Item);
或
myBlockingCollection.Take(Item);
嗯,我認爲最接近的是TakeWhile
,如
myBlockingCollection.TakeWhile(m=>m == Item);
當然的項目類型應實現IComparer
什麼的,或者可能與ID或匹配的東西.....
我認爲TryTake(out item)
會工作。刪除在BlockingCollection類中不存在,Take不會將項目作爲參數。
TryTake(out item)不指定刪除(item)那樣的項目。沒有等價物。 – pauldendulk 2017-02-23 12:47:04
我認爲只有TryTake()是一個選項?我在MSDN的Remove()方法上找不到文檔。
這個代碼怎麼樣? - 它正在工作,但改變了收集的順序。 (而且我沒有在多線程狀態下檢查它)。
public static bool Remove<T>(this BlockingCollection<T> self, T itemToRemove)
{
lock (self)
{
T comparedItem;
var itemsList = new List<T>();
do
{
var result = self.TryTake(out comparedItem);
if (!result)
return false;
if (!comparedItem.Equals(itemToRemove))
{
itemsList.Add(comparedItem);
}
} while (!(comparedItem.Equals(itemToRemove)));
Parallel.ForEach(itemsList, t => self.Add(t));
}
return true;
}
您無法指定要從BlockingCollection<T>
中刪除的特定項目。
Take()
方法從基礎集合中移除項目並返回已移除的項目。
TryTake(out T item)
方法從基礎集合中刪除一個項目,並將刪除的項目分配給out
參數。如果一個項目可以被刪除,該方法返回true;否則,是錯誤的。
刪除的項目取決於BlockingCollection<T>
所使用的基礎集合 - 例如,ConcurrentStack<T>
將具有LIFO行爲,而ConcurrentQueue<T>
將具有FIFO行爲。
這是正確的答案 – pauldendulk 2017-02-23 12:45:52
TakeWhile不會從阻塞集合中刪除任何內容,它只是返回值。 TakeWhile指的是標準的LINQ擴展方法。 – 2012-02-29 20:38:32