代码之家  ›  专栏  ›  技术社区  ›  BoxOfNotGoodery

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

  •  4
  • BoxOfNotGoodery  · 技术社区  · 15 年前

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

    能够旋转多个线程。

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

    编辑:

    3 回复  |  直到 15 年前
        1
  •  6
  •   Andrew Barber Eric Lafortune    15 年前

    您的需求基本上排除了使用.NET线程池的可能性;

    它通常不应该用于长时间运行的线程,因为有耗尽池的危险。

    不过,它在Windows服务中确实工作得很好,而且您可以启动多个线程—自动受到池的限制。

    使用线程池不能保证线程的启动时间;当线程池有足够的空闲线程时,它可能会将线程排队等待执行,甚至不能保证它们会按照提交的顺序启动。

    没有简单的方法可以检测和终止线程池中正在运行的线程

    因此,基本上,您需要查看线程池之外的内容;我建议您可能需要“full” System.Threading.Thread 实例只是由于您的所有要求。只要您处理并发性问题(对于任何线程机制都是如此),我并不觉得自己管理线程类有那么困难。

        2
  •  1
  •   Henk Holterman    15 年前

    答案很简单,但是 Task 类(Fx4)满足您的大多数要求。

    取消是合作的。
    但是检测挂起的线程是困难的,这是一个非常高的要求。

    但我也可以阅读您对JobQueue的要求,其中“work”由大多数相似的作业组成。您可以运行自己的系统,该系统使用该队列并在几个线程上监视执行。

        3
  •  1
  •   Ed Power    15 年前

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

    1. 创建运行辅助方法的线程并将其添加到 Queue<Thread> .
    2. Dictionary<int, Worker>
    3. 当每个工作线程完成时,它会从主管调用一个回调方法,该方法会传回其ManagedThreadId。
    4. 向长时间运行的工作线程发出退出或中止其线程的信号。
    5. 主管调用对主线程的回调来通知进度等。