0


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

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

或者

Thread t = new Thread(Consumer.Start);
4

2 回答 2

0

如果您担心计算机资源,一个解决方案可能是创建一个工作线程池,所有这些工作线程都监视任务队列,一旦将任务放入队列并且工作线程空闲,它就会从队列中读取它并开始工作?

这应该很容易设置。

//丹尼尔

于 2011-04-26T09:37:30.277 回答
0

也许是一个组合。

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

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

您可能应该启动 N 个消费者并为 N 设备一些策略。这在很大程度上取决于工作量、I/O 的使用等。

可能的策略是

  • N = 核心数 (- 1)
  • 当 Queue.Count > M 时启动一个新的消费者

而且您也可以使用任务(带有 LongRunning 选项)而不是线程。

于 2011-04-26T09:38:12.917 回答