为什么使用System.Threading.Thread.Sleep()是一种不好的做法?

use*_*319 4 c# multithreading sleep

我正在编写一个应用程序,通过复杂的API处理大而丑的第三方系统.有时在系统中会发生一些错误,但是如果我们等待我的程序面对这个错误,那就太晚了.

所以,我使用一个单独的线程来检查系统状态如下:

while (true)
{
    ask_state();
    check_state();
    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}
Run Code Online (Sandbox Code Playgroud)

如果我在100毫秒或每分钟检查一次系统状态并不重要.

但我听说使用Thread.Sleep()是一种不好的做法.为什么?在这种情况下我该怎么办?

Sae*_*ati 5

一个原因是Thread.Sleep()阻止您的代码执行任何其他操作.最近的努力是尽可能地阻止阻塞.例如,node.js是一种非阻塞语言.

更新:我不知道TimerC#中的类的基础结构.也许它也在阻塞.

您可以安排任务每100毫秒检查一次第三个API.这样,在100毫秒期间,您的程序可以执行其他任务.

更新:这个类比可能会有所帮助.如果我们将操作系统与医院进行比较,并将线程与该医院的护士进行比较,那么主管(程序员)可以选择一个策略:

  1. 要么是要求每个护士(线程)看一个,只有一个病人(一份工作,一项要完成的任务),即使每次检查之间她等了一个小时(Sleep()方法)
  2. 要求每位护士检查每位患者,并在间隔期间直到下一次检查,继续检查其他患者.

第一个模型是阻止.它不可扩展.但在第二种模式中,即使护士很少,您也可以为许多患者服务.

  • OTOH,使用定时器意味着将代码编写为一个非常混乱的异步状态机,而不是像单独的线程那样内联,其中Sleep()可以在任何函数深度的任何地方调用.从定时器管理线程触发定时器至少需要与Sleep()调用一样多的上下文更改,如果定时器回调发出另一个正在等待输入消息的线程,则可能加倍. (3认同)
  • 在这种情况下,他正在一个单独的线程中进行检查 (2认同)