【发布时间】:2014-07-18 23:13:57
【问题描述】:
我有一种情况,我需要有大量(数百个)队列,其中项目应该按顺序处理(需要单线程消费者)。我的第一个实现,based on the samples, 我为每个 BlockingCollection 使用了一个长时间运行的任务来使用队列项。然而,我最终得到了一个拥有数百个线程的应用程序,这些线程大多处于空闲状态,除了消耗内存之外什么都不做,因为队列大部分时间都是空的。
我认为只有在队列中有要处理的内容时才运行消费者任务会更好,但是,我无法找到提供最佳实践的示例。
我想出了一个类似于下面的解决方案。但问题是,每个项目都会导致一个新任务(也许这效率低下?浪费资源?)。但是,如果我不为每个项目创建一个新任务,我不能保证一个项目不会处于未处理的队列中。
private object _processSyncObj = new object();
private volatile bool _isProcessing;
private BlockingCollection<string> _queue = new BlockingCollection<string>();
private void EnqueueItem(string item)
{
_queue.Add(item);
Task.Factory.StartNew(ProcessQueue);
}
private void ProcessQueue()
{
if (_isProcessing)
return;
lock (_processSyncObj)
{
string item;
while (_isProcessing = _queue.TryTake(out item))
{
// process item
}
}
}
什么是这种情况的最佳实践/最佳解决方案,以保证不存在项目在队列中但没有消费者正在运行的情况?
【问题讨论】:
-
为什么不在 BlockingCollection 的参与中启动任务?
-
我想按顺序处理项目。这意味着,第一个项目应该完成处理,然后应该处理下一个项目。如果我为每个项目启动任务,那么它们将被并行处理。或者,你还有别的意思吗?
-
按队列排序还是按队列排序?
-
“数百个 BlockingCollection 队列”是这个问题的开始。您没有说明为什么您认为这很有用。
-
按队列排列。每个队列彼此完全独立。
标签: c# .net blockingcollection