Windows 服务卡在“启动”状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别

Posted

技术标签:

【中文标题】Windows 服务卡在“启动”状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别【英文标题】:Windows service stuck in 'starting' state and difference between Thread.Sleep() and Task.Delay() 【发布时间】:2020-06-29 09:08:25 【问题描述】:

我的 Windows 服务卡在启动状态。下面是onstart().log() 中的代码将一些值记录到文件中。

while (true)
        
            log();
            Thread.Sleep(TimeSpan.FromMinutes(5));
        

经过一些实验,我将onstart() 更改为

while (true)
        
            log();
            await Task.Delay(TimeSpan.FromMinutes(5)).ConfigureAwait(false);
        

一旦我将代码服务状态更改为正在运行并且工作正常。 Thread.Sleep() 和 Task.Delay() 有什么区别,我认为两者都在延迟执行。谁能帮我理解

【问题讨论】:

OnStart 中你永远都不想同时拥有任何一个。 【参考方案1】:

我建议您使用System.Timers.Timer,其中Elapsed 事件您将完成日志记录工作。在OnStart 中,您只需启动计时器,而在OnStop 中您清理(StopDispose 计时器)。

关于DelaySleep 的注意事项。记住差异的简单方法是注意Delay 重新调用Task,因此如果不是awaited,它将异步运行(因此执行不会停止)。 Thread.Sleep 相反,阻塞当前线程。

【讨论】:

【参考方案2】:

调用OnStart的线程不是你可以随意处理。它实际上用于响应指向您的服务的服务控制管理器请求。在您从OnStart返回之前,您的服务不会被视为已启动。

Thread.SleepTask.Delay 之间的主要区别在于,第一个 阻塞当前线程,而第二个(如果与 await 一起使用,而不是延迟为 0)将结束释放当前线程。

一旦您将async/await 添加到您的OnStart 方法中,您实际上会在执行的第一个点从该方法返回,其中代码在尚未完成的事情上遇到await - 您的await Task.Delay.

【讨论】:

以上是关于Windows 服务卡在“启动”状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何解决虚拟机系统无法正常启动窗口

为啥每次开机都提示windows安全中心已停止服务

Windows服务调试状态下用Console启动

无法启动 OBIEE 12c 服务器组件

Windows域策略 设置客户端服务启动状态 全域策略生效

Windows域策略 设置客户端服务启动状态 全域策略生效