【问题标题】:Threadpool, order of execution and long running operations线程池、执行顺序和长时间运行的操作
【发布时间】:2011-04-15 19:29:18
【问题描述】:

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

要求:

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

能够启动多个线程。

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

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

编辑:

评论似乎导致手动线程。不幸的是,我坚持使用 3.5 版本的框架。 Threadpool 很有吸引力,因为它允许我排队工作并在资源可用时为我创建线程。是否有一个很好的 3.5 兼容模式(也许是生产者/消费者)可以在不实际使用线程池的情况下为我提供线程池的这一方面?

【问题讨论】:

  • 不存在能够可靠地杀死线程而不会严重破坏应用程序稳定性的 TP。

标签: c# multithreading threadpool


【解决方案1】:

您的要求基本上排除了使用 .NET 线程池;

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

不过,它在 Windows 服务中运行良好,您可以启动多个线程 - 自动受池限制。

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

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

所以本质上,你会想看看线程池之外的东西;我可能会建议您可能只是由于您的所有要求而需要“完整”System.Threading.Thread 实例。只要您处理并发问题(就像您必须使用任何线程机制一样),我认为 Thread 类并不是那么难以管理自己,真的。

【讨论】:

    【解决方案2】:

    简单的答案,但Task 类 (Fx4) 满足您的大部分要求。

    取消是合作的,即您的任务代码必须检查它。
    但是检测挂起的线程很难,反正要求很高。

    但我也可以阅读您对 JobQueue 的要求,其中的“工作”主要由相似的工作组成。您可以推出自己的系统来消耗该队列并监控几个线程上的执行。

    【讨论】:

    • 为 Reactive Extensions 框架添加一个插件,这个答案将非常适合 OP 的 .NET Framework 3.5 要求。
    • @Brian,可能是个好主意,但由于我对 Rx 一无所知,所以我将把它留给其他人。
    • 我愿意,但你的答案已经很完美了。另外,我不想抢你的风头:) Rx 框架包含 TPL 的反向端口,包括 Task 类。这就是为什么我认为您可以在答案中提及。顺便说一句,我是你的 +1。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2015-02-26
      相关资源
      最近更新 更多