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
中您清理(Stop
和Dispose
计时器)。
关于Delay
与Sleep
的注意事项。记住差异的简单方法是注意Delay
重新调用Task
,因此如果不是await
ed,它将异步运行(因此执行不会停止)。 Thread.Sleep
相反,阻塞当前线程。
【讨论】:
【参考方案2】:调用OnStart
的线程不是你可以随意处理。它实际上用于响应指向您的服务的服务控制管理器请求。在您从OnStart
返回之前,您的服务不会被视为已启动。
Thread.Sleep
和 Task.Delay
之间的主要区别在于,第一个 阻塞当前线程,而第二个(如果与 await
一起使用,而不是延迟为 0)将结束释放当前线程。
一旦您将async
/await
添加到您的OnStart
方法中,您实际上会在执行的第一个点从该方法返回,其中代码在尚未完成的事情上遇到await
- 您的await Task.Delay
.
【讨论】:
以上是关于Windows 服务卡在“启动”状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章