我有多个线程生成项目并将它们粘贴在一个共同的位置ConcurrentQueue
:
private ConcurrentQueue<GeneratedItem> queuedItems = new ConcurrentQueue<GeneratedItem>();
private void BunchOfThreads () {
// ...
queuedItems.Enqueue(new GeneratedItem(...));
// ...
}
我有另一个单一的消费者线程,但它需要在这个应用程序的上下文中工作的方式是,偶尔,它只需要抓住当前线程队列中的所有内容,将其从该队列中删除,一键完成。就像是:
private Queue<GeneratedItem> GetAllNewItems () {
return queuedItems.TakeEverything(); // <-- not a real method
}
我想我查看了所有文档(关于集合及其实现的接口),但我似乎没有找到类似“同时从队列中获取所有对象”,甚至“同时与另一个队列交换内容”之类的东西。
如果我放弃并只用 aConcurrentQueue
保护正常,我可以做到这一点,如下所示:Queue
lock
private Queue<GeneratedItem> queuedItems = new Queue<GeneratedItem>();
private void BunchOfThreads () {
// ...
lock (queuedItems) {
queuedItems.Enqueue(new GeneratedItem(...));
}
// ...
}
private Queue<GeneratedItem> GetAllNewItems () {
lock (queuedItems) {
Queue<GeneratedItem> newItems = new Queue<Event>(queuedItems);
queuedItems.Clear();
return newItems;
}
}
但是,我喜欢它的便利性,ConcurrentQueue
而且因为我刚刚学习 C#,所以我对 API 很好奇;所以我的问题是,有没有办法用其中一个并发集合来做到这一点?
是否有某种方法可以访问任何同步对象ConcurrentQueue
使用并为我自己的目的将其锁定,以便一切都可以很好地协同工作?然后我可以锁定它,拿走所有东西,然后释放?