如何从BlockingCollection中删除项目?以下哪项是正确的?
myBlockingCollection.Remove(Item);
Run Code Online (Sandbox Code Playgroud)
要么
myBlockingCollection.Take(Item);
Run Code Online (Sandbox Code Playgroud)
您无法指定要从中删除的特定项目BlockingCollection<T>.
该Take()方法从基础集合中删除项目并返回已删除的项目.
该TryTake(out T item)方法从基础集合中删除项目,并将删除的项目分配给out参数.如果可以删除项,则该方法返回true; 否则,错误.
删除的项取决于使用的基础集合BlockingCollection<T>- 例如,ConcurrentStack<T>将具有LIFO行为并且ConcurrentQueue<T>将具有FIFO行为.
小智 5
这段代码怎么样?- 它正在工作,但改变了集合的顺序。(我没有在多线程状态下检查它)。
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12293 次 |
| 最近记录: |