我编写了一个小型Windows服务,它定期执行任务。它似乎工作正常,但我有一个担忧。
OnStart
方法启动一个“工作线程”,负责执行任务,等待一段时间,然后重复该任务。
在“管理工具”的“Windows服务”部分中,我可以对其进行设置,以便服务在失败时自动重启。
但是,在工作线程抛出异常的情况下,服务似乎继续运行。我认为如果工作线程抛出异常,则应该认为该服务已停止,Windows应该采取服务设置中指定的异常。
实现这一目标的最佳做法是什么?
答案 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