0

我有一个队列(实际上是 3 个不同的队列,但我不相信这会有所作为)。队列包含离散的工作单元。

我有一个QueueManager产生一个新线程并返回的。新线程查看队列,获取一份工作,然后生成一个新线程来处理它。

我显然希望限制并发线程的数量,并且看不到有任何理由在完成工作后不重用线程。

有些作业需要一段时间才能运行(几分钟/几小时),我已经读到这ThreadPool对于需要几秒钟以上的任何事情来说都不是一个好的选择。

实际上,我想实现 ThreadPool 但有更多控制权。

那么......实现这一目标的标准、最佳实践方法是什么?

看来我需要(假设队列长度 > MaxThreadCount

  • 创造新的工作,直到我击中MaxThreadCount
  • 等到任何线程完成
  • 从队列中获取下一个作业并将其分配给线程
  • 重复
  • 如果队列为空,则休眠一段时间,然后重新检查

(在这种情况下,队列在数据库中,因此添加项目时没有事件 - 我假设我只需要轮询)

许多工作涉及从远程站点/API 检索页面,通常是重复的。因此,我相信我会受益于拥有比核心多得多的线程(因为它们中的大多数将等待网络)。因此,我认为 WaitHandle不合适,因为它有 64 线程的限制。

这显然是一种非常常见的模式,所以我认为必须有一种成熟的方式来实现它?

如果有人能给我举一个很好的例子,那就太好了。

4

1 回答 1

2

使用 TPL(任务并行库)。它正是为此目的而设计的。

http://msdn.microsoft.com/en-us/library/dd460717.aspx

具体来说,听起来您应该使用TaskScheduler实例创建一个TaskFactory,该实例的MaximumConcurrencyLevel已设置为您想要的线程数。然后,不要将工作项放入队列中,而是调用TaskFactory.StartNew。它将为您处理工作排队。

于 2012-06-15T15:26:14.227 回答