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.SleepTask.Delay 之间的主要区别是第一个 阻塞当前线程 ,而第二个,(如果与 [=14 一起使用=] 而不是延迟 0) 将最终 释放 当前线程。

一旦你将 async/await 添加到你的 OnStart 方法,你实际上 return 从代码遇到的第一个执行点的方法关于尚未完成的事情的 await - 你的 await Task.Delay.

我建议有一个 System.Timers.Timer,在其中 Elapsed 事件你会做日志记录的工作。在 OnStart 中,您只需启动计时器,而在 OnStop 中,您可以清理(StopDispose 计时器)。

关于 DelaySleep 的考虑。记住差异的简单方法是注意,Delay 返回一个 Task,因此它将是 运行 异步(因此执行 不会停止 ) 如果没有 awaited。 Thread.Sleep 相反,阻塞当前线程。