我正在尝试使用 BlockingQueue 构建一个通用的生产者/消费者。
我希望它尽可能多线程或并行,但不占用所有计算机资源。
假设我们有一个生产者,在消费数据时将消费者作为线程还是一个消费者与任务更好?
while(true)
{
queue.TryTake(...) { Task.Factory.StartNew(...); }
}
或者
Thread t = new Thread(Consumer.Start);
我正在尝试使用 BlockingQueue 构建一个通用的生产者/消费者。
我希望它尽可能多线程或并行,但不占用所有计算机资源。
假设我们有一个生产者,在消费数据时将消费者作为线程还是一个消费者与任务更好?
while(true)
{
queue.TryTake(...) { Task.Factory.StartNew(...); }
}
或者
Thread t = new Thread(Consumer.Start);
如果您担心计算机资源,一个解决方案可能是创建一个工作线程池,所有这些工作线程都监视任务队列,一旦将任务放入队列并且工作线程空闲,它就会从队列中读取它并开始工作?
这应该很容易设置。
//丹尼尔
也许是一个组合。
你的第一个提案有一个问题,当队列被填满时,你会开始很多任务,也许太多了。
第二个将仅使用 1 个线程(我假设这就是您的意思)。
您可能应该启动 N 个消费者并为 N 设备一些策略。这在很大程度上取决于工作量、I/O 的使用等。
可能的策略是
而且您也可以使用任务(带有 LongRunning 选项)而不是线程。