C#4.0的新BlockingCollection没有满足我们需要的简单要求:
*任务项的并发队列。
*消费者 - 一次限制N个线程 - 来自线程池(线程不专用于此队列,如果队列中没有项目则不会被阻止)。
对于资源使用特别有用,我们需要一次只限制一个(N = 1)线程,并且队列可能不时是空的。
SmartThreadPool有一个很好的实现,使用大小为1的threads-group。
我正在寻找一个使用新的C#4.0并行库的好解决方案,利用.Net内部线程池。 我可以想到一些解决方案,但我想知道是否有一些我缺少的优雅。
您怎么看?
此致 施洛米
答案 0 :(得分:0)
线程池中的任务不应该阻止。虽然已经在.NET 4.0中完成了工作以帮助支持它,但Threadpool并不适用于长时间运行的任务,当然也不适用于阻塞的操作(经验法则,如果线程启动时间可以忽略不计,那么任务,那么你最好开始自己的线程。)
听起来你想要做的事情,你可能会更好地使用IObservable
的东西。看看Rx(Reactive)Extensions,你可以用IObservable做一些非常酷的事情。默认情况下,IObservable一次只处理一个请求,但您可以轻松地将每个对象发送给您并将其抛出到线程池(用于实际处理)和/或使用TPL。具有最大并行度的TaskScheduler可能会对您有所帮助。
我想不出任何可以满足您需求的开箱即用的东西。您可能希望将ConcurrentQueue
与EventWaitHandle
以及可以控制的一些工作线程配对。
答案 1 :(得分:0)
如果有人对提议的解决方案感兴趣,请参阅msdn论坛下的以下主题: msdn parallel computing forums question
我问上述相关问题,Stephen Toub给了我一个满意的答案。
施洛米