c# 4.0的新BlockingCollection没有满足我们需要的一个简单要求:
*任务项的并发队列。
*消费者-一次限制N个线程-来自线程池(非专用于此队列的线程,如果队列中没有项目则不会阻塞)。特别适用于我们每次只需要限制一个(N = 1)线程的资源使用,并且队列可以不时为空。
SmartThreadPool有一个很好的实现,使用大小为1的线程组。
我正在寻找新的c# 4.0并行库的一个很好的解决方案,利用。net内部线程池。我可以想到一些解决方案,但我想知道是否有一些优雅的东西我错过了。
你觉得怎么样?
问候,Shlomi
线程池中的任务不应该阻塞。虽然在。net 4.0中已经做了一些工作来帮助支持它,但线程池并不是真正用于长时间运行的任务,当然也不是用于阻塞的操作(根据经验,如果线程启动时间对于任务所花费的时间可以忽略不计,那么你最好自己启动线程)。
听起来你想做的事情,你可能更适合IObservable
的东西。看看Rx(响应式)扩展,你可以用IObservable做一些很酷的事情。默认情况下,IObservable一次只处理一个请求,但你可以很容易地在每个对象被发送给你时把它扔到线程池中(用于实际处理)和/或使用TPL。一个具有最大并行度的TaskScheduler可能会对你有所帮助。
我想不出有什么现成的东西能满足你的要求。您可能希望将ConcurrentQueue
与EventWaitHandle
以及您可以控制的一些工作线程配对。
如果有人对提议的解决方案感兴趣,请参阅MSDN论坛下的以下帖子:MSDN并行计算论坛问题。
这是我问的与上面有关的问题,Stephen Toub给了我一个满意的答案。
Shlomi