【问题标题】:How to solve this specific threading problem如何解决这个特定的线程问题
【发布时间】:2010-11-01 10:41:53
【问题描述】:

使用下面文章中的代码,我实现了一个自己的线程池: http://www.developer.com/net/article.php/3783756

这就是我想要实现的目标: 通过计时器触发,服务应每 5 秒查询一次数据库以执行新作业。 Job 基本上只是有关需要使用参数运行的命令行程序的信息。

最多可以同时执行 50 个或更多这些程序。一个程序可以运行几秒钟、几分钟甚至几小时。服务需要始终控制这些程序,例如,它必须能够根据请求终止程序。

使用上面的 ThreadPool 实现,我开始对要执行的程序进行排队,并且可以查看服务何时真正执行它们。到目前为止没有问题。然而,这里的机制是这样工作的:

ThreadPool 创建一个工作线程并启动它。每当程序排队时,工作线程都会注意到这一点并调用一个委托,该委托实质上实例化了一个 System.Diagnostics.Process 对象并启动外部程序。然后线程完成了它的工作并且能够启动更多的程序。但是...当没有程序启动时,一个空闲的计时器会让线程管理器杀死线程,从而中断已经启动的进程。

这不是我需要的。这里有人知道如何更好地处理我描述的场景吗?

【问题讨论】:

    标签: multithreading windows-services threadpool


    【解决方案1】:

    AFAIK,由 Process.Start 产生的进程将继续运行,即使调用 Process.Start 的线程退出。下面的代码说明了这一点。主程序退出后LongRunningApp.exe会继续运行:

    static void Main(string[] args)
    {
        Process p = new Process();
        ProcessStartInfo psi = new ProcessStartInfo(@"C:\LongRunningApp.exe");
        psi.CreateNoWindow = true;
        psi.UseShellExecute = false;
        p.StartInfo = psi;
        p.Start();
        Console.ReadLine();
    }
    

    【讨论】:

      【解决方案2】:

      您确定线程池是处理此问题的最佳方式吗?为每个进程生成一个新线程,该线程大部分是空闲的,但在进程终止之前必须存在,这对我来说似乎是在浪费线程。

      我会用一个线程和一个进程字典来实现所有这些。该线程会定期查询数据库和所有进程以查看需要执行哪些操作。

      【讨论】:

      • 你是对的,...使用集合可能更有意义。
      【解决方案3】:

      1) 为什么这个进程中一个线程的死亡会导致另一个已启动进程的死亡?如果你回答了这个问题,你的问题就解决了。

      2) 这看起来是一篇非常糟糕且相当幼稚的 ThreadPool 文章。查看自定义线程池上的 Joe Duffy's 系列(part 1part 2part 3)。诸如此类的代码出奇地复杂,而且其本身的维护负担也很大。

      3)(真正的答案)您为什么要使用线程池来执行此操作?您的线程池一次只使用一个线程,为什么不使用计时器并触发您的主线程呢?除了需要保持响应的 UI 之外,您的应用是否还会执行其他操作?

      摆脱线程池,没有必要,它让你的生活变得困难,而且线程池通常不是为托管长时间运行的任务而设计的。这就是单个线程的用途。如果您必须在单独的线程上触发计时器,只需创建一个线程来处理它并使用这个相同的线程来生成所有进程。然后,您可以在一个集中、合理的位置跟踪您的流程状态。 :)

      【讨论】:

      • 嗯。实际上,客户要求使用线程(这也是他所做的,现在希望我们在 .NET 中做)。现在我对这个“糟糕的”线程池实现有了一些经验,我注意到它没有任何意义。因为启动外部程序已经产生了并行运行的新线程。似乎拥有一个管理流程的集合感觉更正确......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2014-10-07
      • 1970-01-01
      • 2017-12-19
      相关资源
      最近更新 更多