Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 在Windows服务中使用Thread.Sleep()_C#_Multithreading_Windows Services_Sleep - Fatal编程技术网

C# 在Windows服务中使用Thread.Sleep()

C# 在Windows服务中使用Thread.Sleep(),c#,multithreading,windows-services,sleep,C#,Multithreading,Windows Services,Sleep,我正在编写一个需要长时间睡眠的windows服务(睡眠时间最长为15小时,最短为30分钟)。我目前正在使用Thread.Sleep(calculatedTime)将代码置于睡眠模式。Thread.Sleep是最好的选择还是应该使用计时器?我在谷歌上搜索了一段时间,找不到一个简洁的答案。由于这是一个windows服务,我不必担心锁定UI,因此我想不出不使用Thread.Sleep的理由 如果您有任何见解,我们将不胜感激。我将使用一个计时器Thread.Sleep,它可能会导致阻塞,从而阻止服务关闭

我正在编写一个需要长时间睡眠的windows服务(睡眠时间最长为15小时,最短为30分钟)。我目前正在使用Thread.Sleep(calculatedTime)将代码置于睡眠模式。Thread.Sleep是最好的选择还是应该使用计时器?我在谷歌上搜索了一段时间,找不到一个简洁的答案。由于这是一个windows服务,我不必担心锁定UI,因此我想不出不使用Thread.Sleep的理由


如果您有任何见解,我们将不胜感激。

我将使用一个计时器Thread.Sleep,它可能会导致阻塞,从而阻止服务关闭


如果时间间隔如此广泛且有规律,您也可以安排它。但是如果你说的是长的、不一致的时间间隔,那么定时器会更好。

通常认为在很多情况下使用
Thread.Sleep()
是不好的做法

如果希望服务在后台运行,则应使用计时器


如果服务只需要按计划的时间间隔运行,我建议您考虑使用Windows任务计划程序,以便Windows在需要时运行应用程序。

您不应该预先计算如此大量的时间和睡眠时间。最多睡一分钟,然后醒来重新计算时间,再睡一分钟。我假设计算非常便宜,或者可以通过缓存使计算变得非常便宜。我的建议试图缓解的问题是,计算机时钟出人意料地“跳跃”,主要是由于网络时间服务校正的时间漂移,也因为日光节约,而不仅仅是因为用户调整时钟。因此,最好是不断地重新计算如此长的时间间隔,即使这意味着每分钟醒来左右。不要惊讶(例如,不要断言)如果你在“过去”中醒来,时钟可以及时调整。

< P>另一个要考虑的事情是线程是有限的资源,每个线程消耗了它栈的一部分内存(1MB)。它们还可能增加调度程序的负载


现在,如果您的服务没有做很多其他事情,那么浪费的空间是微不足道的,但是在开始分配多个线程之前,明智的做法是意识到这一点。使用线程池和/或计时器效率更高。

由于服务控制管理器可能会随时要求服务停止,因此您的线程应该随时准备好响应这些请求,因此您不应该使用thread.Sleep()。相反,在主线程中创建一个手动重置事件,并在工作线程中使用其WaitOne方法超时。当时间到期时,WaitOne将返回false

当调用服务类的OnStop或OnShutdown方法时,设置事件,这将导致WaitOne返回true,然后可以退出工作线程