Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RequestAdditionalTime()的安全开销是多少?_C#_Windows Services - Fatal编程技术网

C# RequestAdditionalTime()的安全开销是多少?

C# RequestAdditionalTime()的安全开销是多少?,c#,windows-services,C#,Windows Services,我有一个Windows服务,它在不同的线程上生成一组子活动,并且只有当所有这些活动都成功完成时才会终止。我事先不知道在收到停止信号后终止活动可能需要多长时间。在OnStop()期间,我每隔一段时间等待停止信号,只要系统愿意,我就一直请求额外的时间 以下是基本结构: class MyService : ServiceBase { private CancellationTokenSource stopAllActivities; private CountdownEvent run

我有一个Windows服务,它在不同的线程上生成一组子活动,并且只有当所有这些活动都成功完成时才会终止。我事先不知道在收到停止信号后终止活动可能需要多长时间。在OnStop()期间,我每隔一段时间等待停止信号,只要系统愿意,我就一直请求额外的时间

以下是基本结构:

class MyService : ServiceBase
{
    private CancellationTokenSource stopAllActivities;
    private CountdownEvent runningActivities;

    protected override void OnStart(string[] args)
    {
        // ... start a set of activities that signal runningActivities
        //       when they stop
        // ... initialize runningActivities to the number of activities
    }

    protected override void OnStop()
    {
        stopAllActivities.Cancel();

        while (!runningActivities.Wait(10000))
        {
            RequestAdditionalTime(15000); // NOTE: 5000 added for overhead
        }
    }
}
我应该在
RequestAdditionalTime
调用中添加多少“开销”?我担心请求是累积的,而不是基于每次
RequestAdditionalTime
调用的时间点。如果是这样的话,增加开销可能会导致系统最终拒绝该请求,因为它在未来太遥远了。但是,如果我不增加任何开销,那么我的服务可能会在有机会请求下一段额外时间之前被终止。

确实不鼓励:

MSDN文档没有提到这一点,但在RequestAdditionalTime中指定的值似乎不是实际的“附加”时间。相反,它将替换ServicesPipeTimeout中的值。更糟糕的是,任何大于两分钟(120000毫秒)的值都会被忽略,即上限为两分钟

我希望情况并非如此,但我将此作为最坏情况的答案发布

更新:那篇文章的作者非常友好地对我的评论发表了非常详细的回复,我已将其复制到下面

拉尔斯,简单的回答是不

我想说的是,我现在意识到,Windows服务应该设计为在被请求时快速启动和终止处理

作为开发人员,我们倾向于关注处理的实现,然后将其打包并作为Windows服务交付

然而,这并不是设计Windows服务的正确方法。服务必须能够快速响应启动和停止请求,不仅当管理员从服务控制台发出请求时,而且当操作系统请求启动(作为其启动处理的一部分)或停止(因为它正在关闭)时

考虑当Windows配置为在UPS发出电源故障信号时关闭时会发生什么情况。服务部门回答“我还需要几分钟……”是不合适的

即使在执行长时间运行的处理任务时,也可以编写快速响应停止请求的服务。通常,长时间运行的流程将包括数据的批处理,处理应检查是否在确保数据一致性的最小工作单元级别请求停止

例如,我发现停止超时的第一个服务是一个涉及远程服务器上通知队列处理的问题。处理从队列中检索通知,调用web服务检索与通知主题相关的数据,然后编写数据文件供另一个应用程序处理

我将处理实现为对单个方法的计时器驱动调用。一旦调用了该方法,它就不会返回,直到队列中的所有通知都已处理完毕。我意识到这对于Windows服务来说是一个错误,因为有时候队列中可能会有上万个通知,处理可能需要几分钟

该方法能够每秒处理50个通知。所以,我应该做的是在处理每个通知之前执行一个检查,看看是否请求停止。这将允许该方法在完成通知处理后但在开始处理下一个通知之前返回。这将确保服务对停止请求做出快速响应,并且当服务重新启动时,任何挂起的通知都保持排队等待处理