multithreading - 如何解决这个特定的线程问题

标签 multithreading windows-services threadpool

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

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

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

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

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

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

最佳答案

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

2) 这看起来是一篇相当糟糕、相当幼稚的 ThreadPool 文章。查看Joe Duffy's关于自定义线程池的系列( part 1part 2part 3 )。诸如此类的代码极其复杂,并且其本身就是一个巨大的维护负担。

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

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

关于multithreading - 如何解决这个特定的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/969354/

相关文章:

java - Callable 接口(interface)是一个线程吗?它工作时我无法运行任何东西

java - 实现 run() 的好、有效的方法是什么?

C# 使用多线程或并行执行执行 SQL SP

c# - 如何在操作系统关闭期间延迟 Topshelf 服务停止

java - 如何从java应用程序创建Windows服务

C# Windows 服务自终止服务

c# - 发送大量数据时“连接被远程主机强行关闭”

c++ 存储函数和参数列表以备后用

ios - 核心数据更改不合并

c - 循环内创建线程