我有一个帖子将项目添加到BlockingCollection
。
在我正在使用的另一个主题上
foreach (var item in myCollection.GetConsumingEnumerable())
如果出现问题,我想突破我的foreach和我的方法并清除BlockingCollection
中剩下的内容,但是我找不到办法。
有什么想法吗?
答案 0 :(得分:16)
我正在使用此扩展方法:
public static void Clear<T>(this BlockingCollection<T> blockingCollection)
{
if (blockingCollection == null)
{
throw new ArgumentNullException("blockingCollection");
}
while (blockingCollection.Count > 0)
{
T item;
blockingCollection.TryTake(out item);
}
}
我想知道是否有一个更好,更少hacky的解决方案。
答案 1 :(得分:6)
可能使用GetConsumingEnumerable
的重载CancellationToken
;那么,如果生产方出现任何问题,它可以取消消费者。
答案 2 :(得分:5)
这对我有用
while (bCollection.Count > 0)
{
var obj = bCollection.Take();
obj.Dispose();
}
Take()
从集合中删除,您可以调用对象的任何清理,并且循环条件不会调用任何阻塞调用。
答案 3 :(得分:2)
取出所有剩余物品:
while (collection.TryTake(out _)){}
答案 4 :(得分:1)
BlockingCollection<T> yourBlockingCollection = new BlockingCollection<T>();
我认为你的意思是清除你的阻挡系列。乔恩的答案更适合我认为的实际问题。
答案 5 :(得分:-3)
只需清除收藏品即可:
myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null);
或只是
myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);