在通用生产者/消费者中使用任务

时间:2011-04-26 08:55:53

标签: c# multithreading parallel-processing producer-consumer


我正在尝试用BlockingQueue构建一个通用的生产者/消费者 我希望它尽可能多线程或并行,但不要吃掉所有的计算机资源 假设我们有一个生产者,将消费者作为线程或一个消费者更好 消费数据时的任务?

while(true)  
{
   queue.TryTake(...) { Task.Factory.StartNew(...); }
}

Thread t = new Thread(Consumer.Start);

2 个答案:

答案 0 :(得分:0)

如果您担心计算机资源,解决方案可能是执行所有监视任务队列的工作线程池,并且只要将任务放入队列并且工作线程空闲,它就会从队列中读取它并开始工作?

这应该很容易设置。

//丹尼尔

答案 1 :(得分:0)

也许是一个组合。

你的第一个提案有一个问题,当队列填满时,你会开始很多任务,也许太多了。

第二个只使用1个线程(我假设这就是你的意思)。

你可能应该为N个消费者和N设备制定一些策略。这在很大程度上取决于工作量,I / O等的使用。

可能的策略是

  • N = NumberOfCores( - 1)
  • 在Queue.Count>时启动新的消费者中号

您也可以使用Task(使用LongRunning选项)而不是Thread。