3

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

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

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

我该怎么做呢?这是一个合理的架构吗?我应该把每个线程变成一个单独的服务,还是应该有一个多线程服务?

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

4

2 回答 2

2

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

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

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

于 2012-11-27T15:07:19.337 回答
0

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

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

于 2012-11-27T15:01:17.970 回答