我有一个队列(实际上有3个不同的队列,但我不认为这会产生影响)。该队列包含不连续的工作单元。
我有一个QueueManager
产生一个新线程并返回。新线程查看队列,获得一项工作,然后生成一个新线程来处理它。
我显然希望对并发线程数量进行限制,并且在完成作业后看不出有任何理由不重用线程。
有些工作需要一段时间才能运行(分钟/小时),而且我已经读过ThreadPool
不适合任何需要几秒钟的时间。
实际上,我想实现ThreadPool,但需要更多控制。
那么......实现这一目标的标准,最佳实践方法是什么?
我似乎需要(假设队列长度> MaxThreadCount
)
MaxThreadCount
(在这种情况下队列在数据库中,因此添加项目时没有事件 - 我假设我只需要轮询)
许多工作都涉及从远程站点/ API检索页面,通常是反复检索。因此,我相信我会从拥有比核心更多的线程中受益(因为大多数线程都在等待网络)。因此,我不相信 WaitHandle
是合适的,因为它具有64线程限制。
这显然是一种非常常见的模式,所以我认为必须有一种完善的实现方式?
如果有人可以给我一个很好的例子,那就太棒了。
答案 0 :(得分:2)
使用TPL(任务并行库)。它的设计正是为了这个目的。
http://msdn.microsoft.com/en-us/library/dd460717.aspx
具体来说,您应该创建一个TaskFactory,其TaskScheduler实例的MaximumConcurrencyLevel已设置为您想要的线程数。然后,不要将您的工作项放入队列,而是调用TaskFactory.StartNew。它将为您处理工作排队。