Threadpool,执行顺序和长时间运行的操作

时间:2010-09-22 15:24:54

标签: c# multithreading threadpool

我需要在新应用程序中创建多个处理线程。每个线程都有可能“长时间运行”。有人可以评论内置的.net线程池或一些现有的自定义线程池的可行性,以便在我的应用程序中使用吗?

要求:

在Windows服务中运行良好。 (可以从队列中删除排队的工作,可以告诉当前正在运行的线程暂停)

能够启动多个线程。

工作需要按顺序启动,但多个线程可以并行处理。

可以检测并杀死挂起的线程。

编辑:

评论似乎正在引领手动线程化。不幸的是,我坚持使用3.5版本的框架。 Threadpool很吸引人,因为它可以让我排队工作,并在资源可用时为我创建线程。是否有一个很好的3.5兼容模式(生产者/消费者)可以给我这个线程池方面而不实际使用线程池?

3 个答案:

答案 0 :(得分:6)

您的要求基本上排除了使用.NET ThreadPool;

由于存在耗尽水池的危险,通常不应该用于长时间运行的线程。

它在Windows服务中运行良好,并且您可以启动多个线程 - 由池的限制自动限制。

您无法保证线程池的线程启动时间;当它有足够的空闲时,它可以将线程排队执行,甚至不保证它们会按照你提交的顺序启动。

在ThreadPool中没有简单的方法来检测和杀死正在运行的线程

基本上,你会想要在ThreadPool之外看;我可能会建议您可能需要'完整'System.Threading.Thread实例,这可能仅仅是因为您的所有要求。只要你处理并发问题(就像你必须使用任何线程机制一样),我发现Thread类并不是那么难以管理自己,真的。

答案 1 :(得分:1)

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

取消是合作的,即您的任务代码必须检查它 但检测悬挂线程很困难,无论如何这都是一个非常高的要求。

但我也可以阅读你对JobQueue的要求,其中'work'主要由类似的工作组成。您可以滚动自己的系统,消耗该队列并监视几个线程上的执行。

答案 2 :(得分:1)

我通过创建自己的线程管理器与.Net 3.5基本相同:

  1. 实例化知道已运行多长时间的工作类。
  2. 创建运行worker方法的线程并将其添加到Queue<Thread>
  3. 主管线程从队列中读取线程,并在启动它们时将它们添加到Dictionary<int, Worker>,直到它达到其最大运行线程。将该线程添加为Worker实例的属性。
  4. 当每个工作程序完成时,它会从主管调用一个回调方法来回传其ManagedThreadId。
  5. 主管从Dictionary中删除线程并启动另一个等待线程。
  6. 对正在运行的工作人员的字典进行轮询以查看是否有超时,或者将计时器放在调用回调的工作人员中,如果他们花了太长时间。
  7. 指示长时间运行的工作人员退出或中止其线程。
  8. 主管调用主线程的回调以告知进度等。