Windows 服务卡在 'starting' 状态以及 Thread.Sleep() 和 Task.Delay() 之间的区别
Windows service stuck in 'starting' state and difference between Thread.Sleep() and Task.Delay()
我的 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
的线程不是 你的,你可以随意处理。它实际上用于响应针对您的服务的服务控制管理器请求。在您从 OnStart
.
return 之前,您的服务不会被视为已启动
Thread.Sleep
和 Task.Delay
之间的主要区别是第一个 阻塞当前线程 ,而第二个,(如果与 [=14 一起使用=] 而不是延迟 0) 将最终 释放 当前线程。
一旦你将 async
/await
添加到你的 OnStart
方法,你实际上 return 从代码遇到的第一个执行点的方法关于尚未完成的事情的 await
- 你的 await Task.Delay
.
我建议有一个 System.Timers.Timer
,在其中 Elapsed
事件你会做日志记录的工作。在 OnStart
中,您只需启动计时器,而在 OnStop
中,您可以清理(Stop
和 Dispose
计时器)。
关于 Delay
与 Sleep
的考虑。记住差异的简单方法是注意,Delay
返回一个 Task
,因此它将是 运行 异步(因此执行 不会停止 ) 如果没有 await
ed。 Thread.Sleep
相反,阻塞当前线程。
我的 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
的线程不是 你的,你可以随意处理。它实际上用于响应针对您的服务的服务控制管理器请求。在您从 OnStart
.
Thread.Sleep
和 Task.Delay
之间的主要区别是第一个 阻塞当前线程 ,而第二个,(如果与 [=14 一起使用=] 而不是延迟 0) 将最终 释放 当前线程。
一旦你将 async
/await
添加到你的 OnStart
方法,你实际上 return 从代码遇到的第一个执行点的方法关于尚未完成的事情的 await
- 你的 await Task.Delay
.
我建议有一个 System.Timers.Timer
,在其中 Elapsed
事件你会做日志记录的工作。在 OnStart
中,您只需启动计时器,而在 OnStop
中,您可以清理(Stop
和 Dispose
计时器)。
关于 Delay
与 Sleep
的考虑。记住差异的简单方法是注意,Delay
返回一个 Task
,因此它将是 运行 异步(因此执行 不会停止 ) 如果没有 await
ed。 Thread.Sleep
相反,阻塞当前线程。