如何从 BlockingCollection 中移除一个元素?以下哪种方法是正确的?
myBlockingCollection.Remove(Item);
或者myBlockingCollection.Take(Item);
如何从 BlockingCollection 中移除一个元素?以下哪种方法是正确的?
myBlockingCollection.Remove(Item);
或者myBlockingCollection.Take(Item);
BlockingCollection<T>
中删除特定项。
Take()
方法从基础集合中移除一项并返回已删除的项。
TryTake(out T item)
方法从基础集合中移除一项并将已删除的项分配给out
参数。如果可以删除项目,则该方法返回true;否则返回false。BlockingCollection<T>
所使用的基础集合 - 例如,ConcurrentStack<T>
将具有LIFO行为,而ConcurrentQueue<T>
将具有FIFO行为。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;
}
我认为 TryTake(out item)
可以工作。BlockingCollection 类中不存在 Remove 方法,而 Take 方法也不接受 item 作为参数。