线程池,执行顺序和长时间运行的操作

4
我需要在新应用程序中创建多个处理线程。每个线程可能会是“长时间运行”的状态。请问.NET内置的线程池或一些现有的自定义线程池对于我的应用程序是否可行?
要求:
1. 在Windows服务中工作良好。(可以从队列中删除排队的工作,当前正在运行的线程可以被告知停止)
2. 能够启动多个线程。
3. 工作需要按顺序开始,但是可以并行处理多个线程。
4. 可以检测和终止挂起的线程。
编辑:
评论似乎倾向于手动线程。不幸的是,我只能使用3.5版本的框架。线程池很吸引人,因为它允许我将工作排队,当有资源可用时为我创建线程。是否有一个良好的3.5兼容模式(例如生产者/消费者),可以为我提供线程池的这一方面而不实际使用线程池?

1
没有一个可靠地终止线程而不会严重破坏应用程序的TP存在。 - Hans Passant
3个回答

6
您的要求基本上排除了使用.NET线程池;由于耗尽池的危险,通常不应该用于长时间运行的线程。
但是,在Windows服务中它确实表现良好,您可以启动多个线程,受池限制自动限制。
您无法保证线程池的线程启动时间;当它有足够的空闲线程时,它可能会将线程排队执行,并且甚至不能保证它们将按照您提交它们的顺序启动。
没有简单的方法来检测和终止线程池中正在运行的线程。
因此,您需要寻找线程池之外的解决方案;我建议您也许需要“完整的”System.Threading.Thread实例,只是因为您所有的要求。只要处理并发问题(必须使用任何线程机制),我觉得Thread类并不难管理。

1

简单的回答,但是 Task 类(Fx4)符合您大部分的要求。

取消是协作的,也就是说,您的 Task 代码必须检查它。
但是检测挂起的线程很困难,这是一个非常高的要求。

但我也可以理解您的要求为 JobQueue,其中“工作”主要由类似的任务组成。您可以自己编写系统来消耗该队列并在几个线程上监视执行。


为 Reactive Extensions 框架增加一些宣传语,那么这个答案就完美地满足了 OP 的 .NET Framework 3.5 需求。 - Brian Gideon
@ Brian,也许这是个好主意,但是我对 Rx 一窍不通,所以我将把它留给其他人。 - H H
我本来想翻译的,但是你的答案已经很完美了。而且,我也不想抢你的风头 :) Rx框架包含了TPL的后移版本,包括Task类。所以我想你可以在你的答案中提到一下。顺便说一下,我给你点了个赞。 - Brian Gideon

1

我用 .Net 3.5 做了基本相同的事情,创建了自己的线程管理器:

  1. 实例化知道自己运行时间的工作类。
  2. 创建运行工作方法的线程,并将它们添加到 Queue<Thread> 中。
  3. 监督线程从队列中读取线程并将它们添加到 Dictionary<int, Worker> 中启动它们,直到达到最大运行线程数。将线程作为 Worker 实例的属性添加。
  4. 每个工作完成时,它会从监督线程调用回调方法,传回其 ManagedThreadId。
  5. 监督线程从字典中删除线程并启动另一个等待线程。
  6. 轮询正在运行的工作的字典,以查看是否已超时,或者在工作中放置计时器,如果工作时间过长,则调用回调。
  7. 发出信号让长时间运行的工作停止,或者终止其线程。
  8. 监督线程调用回调函数通知主线程进展情况等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接