将线程应用程序转换为服务

时间:2012-11-27 14:44:28

标签: c# multithreading windows-services

我目前有一个应用程序,它基本上是~10“LongRunning”Task的包装器。每个线程应该无限期地运行,但有时它们会锁定或崩溃,有时包装器应用程序会自动退出(我还没能跟踪它)。此外,包装器应用程序当前只能为一个用户运行,该用户必须是重新启动线程或重新启动整个应用程序的用户。

我目前有一个监视器实用程序让我知道线程何时停止工作以便可以手动重启,但我想自动重新启动它们。我还希望每个人都可以使用包装器来检查线程的状态,以及即使包装器没有运行也要运行的线程。

基于这些目标,我想我想将线程分成Windows服务,并将包装器转换为可以连接到服务以检查其状态并对其进行操作的内容。

我该怎么做呢?这是一个合理的架构吗?我应该将每个线程转换为单独的服务,还是应该使用单个多线程服务?

编辑:所有任务都会记录到同一组输出文件中(通过TextWriter.Synchronized(StreamWriter)),我希望保持这种行为。
它们目前也共享相同的数据库连接,这意味着我需要让所有人同意在必要时同时关闭连接。但是,如果它们被拆分,它们每个都可以使用自己的数据库连接,我不需要担心同步它。我实际上怀疑这一步是目前的失败点之一,因此将其分解将是一件好事。

2 个答案:

答案 0 :(得分:2)

如果可能的话,我建议你留在一个多线程服务中。只需确保在触发Service Stop时正确处理线程。将制动标志放在需要花费大量时间执行的代码块中。这样,您将使您的服务响应Stop事件。记录任何异常并确保等待所有线程退出,直到服务最终停止。这将阻止您在多个线程中运行相同的“任务”。

维护一项服务最终比多项服务更容易。

如果您需要一些可以相互运行或不相邻的功能,则拆分为多个服务是合理的。

答案 1 :(得分:0)

我认为将线程移动到Windows服务不会消除任何问题。该服务仍将随机崩溃,线程仍将随机退出。

我假设您长时间运行的任务实现了一种工作循环。将该循环的主体包装在try-catch中并记录所有异常。不要重新抛出它们,以便任务不会退出。检查日志以找到错误。

相关问题