[英]Removing Elements from BlockingCollection and populating Observable Collection
[英]Removing an item from a BlockingCollection
如何从BlockingCollection中删除项目? 以下哪项是正确的?
myBlockingCollection.Remove(Item);
要么
myBlockingCollection.Take(Item);
您无法指定要从BlockingCollection<T>
删除的特定项目。
Take()
方法从基础集合中删除项目并返回已删除的项目。
TryTake(out T item)
方法从基础集合中删除项目,并将删除的项目分配给out
参数。 如果可以删除项,则该方法返回true; 否则,错误。
删除的项取决于BlockingCollection<T>
使用的基础集合 - 例如, ConcurrentStack<T>
将具有LIFO行为, ConcurrentQueue<T>
将具有FIFO行为。
我认为只有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;
}
我认为TryTake(out item)
会起作用。 BlockingCollection类中不存在Remove,Take不将item作为参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.