如何从BlockingCollection中删除项目?以下哪项是正确的?
myBlockingCollection.Remove(Item);
或
myBlockingCollection.Take(Item);
答案 0 :(得分:8)
您无法指定要从BlockingCollection<T>
中删除的特定项目。
Take()
方法从基础集合中删除项目并返回已删除的项目。
TryTake(out T item)
方法从基础集合中删除项目,并将删除的项目分配给out
参数。如果可以删除项,则该方法返回true;否则,错误。
删除的项目取决于BlockingCollection<T>
使用的基础集合 - 例如,ConcurrentStack<T>
将具有LIFO行为,ConcurrentQueue<T>
将具有FIFO行为。
答案 1 :(得分:4)
我认为只有TryTake()是一个选项吗?我找不到MSDN上的Remove()方法的文档。
答案 2 :(得分:3)
这段代码怎么样? - 它正在工作,但改变了集合的顺序。 (我没有在多线程状态下检查它。)
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;
}
答案 3 :(得分:1)
我认为TryTake(out item)
会奏效。 BlockingCollection类中不存在Remove,Take不将item作为参数。