我正在开发一个使用TPL启动它的主要处理任务的Windows服务应用程序。
处理任务是一个连续的while循环,一旦启动,继续执行,直到发出来自Windows服务基础结构的取消请求。
启动实现如下:
protected override void OnStart(string[] args)
{
continuousProcessingTask = Task.Factory.StartNew(
() => DoStuffInAWhileLoopUntilCancelled(cancellation), cancellation,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
问题是,如果主要任务中某处出现无法处理的异常(在DoStuffInAWhileLoopUntilCancelled方法中),我希望终止服务。
更确切地说,当处理任务中发生未处理的异常时,我希望服务处于一致状态。使用上面的代码片段,最终会出现运行Windows服务的情况,但处理任务已终止,我认为这是不一致的。 根据我的理解,一致的行为意味着处理任务/线程和父服务进程都在运行,或者没有运行。
我最终采用了延续方法,如果主处理线程失败,则关闭服务进程:
protected override void OnStart(string[] args)
{
continuousProcessingTask = Task.Factory.StartNew(
() => DoStuffInAWhileLoopUntilCancelled(cancellation), cancellation,
TaskCreationOptions.LongRunning, TaskScheduler.Default)
.ContinueWith(OnTaskCompleted);
}
void OnTaskCompleted(Task task)
{
if (task.IsFaulted)
{
if (task.Exception != null)
{
Service.EventLog.SafeWriteEntry(task.Exception.ToString(), EventLogEntryType.Error);
}
// shut down the application
System.Environment.Exit(-1);
}
}
但是我不确定这是否是推荐的方法--System.Environment.Exit看起来很丑(并打破了类隔离)。是否有其他选项可以处理此模式中的主要处理任务的终止(第一个代码片段)?
UPD1: 澄清了上面的问题。
答案 0 :(得分:0)
由于服务的预期行为是连续运行,因此在发生异常时终止服务可能不是一个好主意。如果您的应用需要执行几次特定任务,则控制台应用就足够了。
更好的方法是正确处理异常(取决于上下文)并保持服务运行。请注意:正在运行的服务并不一定意味着它正在执行某项任务。您可以保持服务运行并仅在需要时执行任务。
但,如果您需要立即终止服务,可以使用FailFast。