C#4.0并使用有限的非专用线程池线程消费者排队

时间:2011-04-17 09:44:57

标签: c#-4.0 threadpool task-parallel-library

C#4.0的新BlockingCollection没有满足我们需要的简单要求:
*任务项的并发队列。
*消费者 - 一次限制N个线程 - 来自线程池(线程不专用于此队列,如果队列中没有项目则不会被阻止)。 对于资源使用特别有用,我们需要一次只限制一个(N = 1)线程,并且队列可能不时是空的。

为了这个目的,

SmartThreadPool有一个很好的实现,使用大小为1的threads-group。

我正在寻找一个使用新的C#4.0并行库的好解决方案,利用.Net内部线程池。 我可以想到一些解决方案,但我想知道是否有一些我缺少的优雅。

您怎么看?

此致 施洛米

2 个答案:

答案 0 :(得分:0)

线程池中的任务不应该阻止。虽然已经在.NET 4.0中完成了工作以帮助支持它,但Threadpool并不适用于长时间运行的任务,当然也不适用于阻塞的操作(经验法则,如果线程启动时间可以忽略不计,那么任务,那么你最好开始自己的线程。)

听起来你想要做的事情,你可能会更好地使用IObservable的东西。看看Rx(Reactive)Extensions,你可以用IObservable做一些非常酷的事情。默认情况下,IObservable一次只处理一个请求,但您可以轻松地将每个对象发送给您并将其抛出到线程池(用于实际处理)和/或使用TPL。具有最大并行度的TaskScheduler可能会对您有所帮助。

我想不出任何可以满足您需求的开箱即用的东西。您可能希望将ConcurrentQueueEventWaitHandle以及可以控制的一些工作线程配对。

答案 1 :(得分:0)

如果有人对提议的解决方案感兴趣,请参阅msdn论坛下的以下主题: msdn parallel computing forums question

我问上述相关问题,Stephen Toub给了我一个满意的答案。

施洛米