【发布时间】:2011-09-09 23:27:23
【问题描述】:
如果我有一个 ConcurrentQueue,有没有一种首选的方式来使用 Linq 语句来使用它?它没有将所有项目作为序列出列的方法,并且它的枚举器不会删除项目。
我正在进行批量消费,这意味着我想定期处理队列并将其清空,而不是处理它直到它为空并阻塞直到更多项目入队。 BlockingCollection 似乎不会起作用,因为它会在到达最后一项时阻塞,并且我希望该线程执行其他操作,例如清除其他队列。
static ConcurrentQueue<int> MyQueue = new ConcurrentQueue<int>();
void Main()
{
MyQueue.Enqueue(1);MyQueue.Enqueue(2);MyQueue.Enqueue(3);MyQueue.Enqueue(4);MyQueue.Enqueue(5);
var lst = MyQueue.ToLookup(x => x.SomeProperty);
//queue still has all elements
MyQueue.Dump("queue");
}
目前,我已经制作了一个辅助方法
static IEnumerable<T> ReadAndEmptyQueue<T>(this ConcurrentQueue<T> q)
{
T item;
while(q.TryDequeue(out item))
{
yield return item;
}
}
var lk = MyQueue.ReadAndEmptyQueue().ToLookup(x => x.SomeProperty);
MyQueue.Dump(); //size is now zero
有没有更好的方法,还是我做对了?
【问题讨论】:
-
我觉得不错。 ConcurrentQueue 上除了
TryDequeue之外没有其他方法可以出队。您的扩展方法看起来是使其成为 LINQable 的正确方法。
标签: c# .net-4.0 concurrent-collections