如何清空BlockingCollection

我有一个线程添加到BlockingCollection项目。

在另一个线程上我使用foreach (var item in myCollection.GetConsumingEnumerable())

如果有问题,我想打破我的foreach和我的方法并清除BlockingCollection中剩下的任何东西但是我找不到办法去做。

有任何想法吗?

可能使用GetConsumingEnumerable的重载,它接受CancellationToken ,然后如果生产方出现任何问题,它可以取消消费者。

我正在使用这种扩展方法:

 public static void Clear(this BlockingCollection blockingCollection) { if (blockingCollection == null) { throw new ArgumentNullException("blockingCollection"); } while (blockingCollection.Count > 0) { T item; blockingCollection.TryTake(out item); } } 

我想知道是否有一个更好,更少hacky的解决方案。

这对我有用

 while (bCollection.Count > 0) { var obj = bCollection.Take(); obj.Dispose(); } 

Take()从集合中删除,您可以调用对象的任何清理,并且循环条件不会调用任何阻塞调用。

只需取出所有剩余物品:

 while (collection.TryTake(out _)){} 
 BlockingCollection yourBlockingCollection = new BlockingCollection(); 

我以为你的意思是清除阻挡系列。 Jon的回答更适合我认为的实际问题。

只需清除集合即可:

 myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null); 

要不就

 myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);