在处理线程中发生异常时终止Windows服务

时间:2016-05-24 06:05:08

标签: c# multithreading exception-handling windows-services task-parallel-library

我正在开发一个使用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: 澄清了上面的问题。

1 个答案:

答案 0 :(得分:0)

由于服务的预期行为是连续运行,因此在发生异常时终止服务可能不是一个好主意。如果您的应用需要执行几次特定任务,则控制台应用就足够了。

更好的方法是正确处理异常(取决于上下文)并保持服务运行。请注意:正在运行的服务并不一定意味着它正在执行某项任务。您可以保持服务运行并仅在需要时执行任务。

,如果您需要立即终止服务,可以使用FailFast