在.net Windows服务中处理死工作线程的最佳实践?

时间:2013-11-15 19:44:40

标签: c# .net multithreading windows-services

我编写了一个小型Windows服务,它定期执行任务。它似乎工作正常,但我有一个担忧。

OnStart方法启动一个“工作线程”,负责执行任务,等待一段时间,然后重复该任务。

在“管理工具”的“Windows服务”部分中,我可以对其进行设置,以便服务在失败时自动重启。

但是,在工作线程抛出异常的情况下,服务似乎继续运行。我认为如果工作线程抛出异常,则应该认为该服务已停止,Windows应该采取服务设置中指定的异常。

实现这一目标的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

在我们的案例中,我们不希望单个任务崩溃服务(因为可能只是坏数据而所有其他任务都会完成),所以我们只需将所有工作逻辑包装在{ {1}}并记录我们遇到的任何异常。我确实有一些异常跟踪代码,如果服务一直失败(例如网络或数据库关闭),它将关闭服务。

但是,如果您的服务只执行单个任务并且失败是很好的理由停止所有,那么我相信编写代码以将异常编组回主线程将起作用。启动服务时可以保存SynchronizationContext.Current,并在遇到异常时使用它来返回主线程。我相信这项服务会停止(嗯,崩溃)。请原谅代码,如果它不太正确的话。我现在面前没有VS.

try/catch

修改

第二个想法,我认为你可以完成你想要的东西......简单:)

(在Ishmaeel的评论中修改建议使用void OnStart() { _mainThread = SynchronizationContext.Current(); } void DoWork() { try { // Do the stuff... } catch (Exception e) { _mainThread.Post(() => Throw); } } 代替Environment.Exit

Stop