为什么使用System.Threading.Thread.Sleep()是一种不好的做法?我正在编写一个应用程序,通过一个复杂的API来处理一个庞大而丑陋的第三方系统。有时系统中会出现一些错误,但如果我们等待我的程序面对这些错误,那就太晚了。因此,我使用一个单独的线程来检查系统状态,如下所示:while(true){ask_state();检查状态();System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));每分钟检查一次系统状态并不重要。但我听说使用Thread.Sleep()是一种不好的做法。为什么?遇到这种情况怎么办?一个原因是Thread.Sleep()会阻止您的代码执行任何其他操作。最近的努力是尽可能地防止阻塞。例如,node.js是一种非阻塞语言。更新:我不知道C#中Timer类的底层结构。也许它也在阻塞。您可以安排一个任务,每100毫秒检查一次第三个API。这样,对于这100毫秒,您的程序可以执行其他任务。更新:这个类比可能会有所帮助。如果我们将操作系统比作医院,将线程比作医院的护士,那么主管(程序员)可以选择一种策略:要么让每个护士(线程)看一个,而且只看一个病人(一个工人,一个任务待完成),即使她在检查之间等了一个小时(Sleep()方法)也会要求每位护士检查每位患者,并在间隔期间继续检查其他患者,直到下一次检查。第一个模型是阻塞的。它不可扩展。但在第二种模式中,即使护士很少,你也可以为很多病人提供服务。因为如果它在睡眠中等待,关闭该线程的唯一方法是a)等待睡眠结束,或b)使用Thread.Abort或Thread.Interrupt。1如果是长时间的睡眠,那么(a)如果你想反应,它就不太合适。并且(b)如果代码当时实际上没有休眠,那将非常烦人。如果您想以适当的方式中断休眠行为,最好使用可等待对象(例如ManualResetEvent),您甚至可以有条件地将等待放置在可等待对象上,明确说明导致线程退出的原因。1我在这个实例中使用了关闭,因为这是一个非常常见的场景,需要跨线程通信。但是对于任何其他跨线程信号或通信,同样的论点适用,如果它没有关闭,那么Thread.Abort或Thread.Interrupt甚至都不太合适。我会将计时器设置为您想要的任何毫秒数,然后等待我的检查方法完成,顺便说一句,您想使用一个永恒的循环,或者它不是您在那里显示的完整代码?好的,这是我正在谈论的示例:publicvoidmyFunction(){intstartCount=Environment.TickCount;问状态();检查状态();while(true){if(Environment.TickCount-startCount>=20000)//两秒{break;}Application.DoEvents();}}//现在你有了一个有组织的函数,它使你想要的任务每隔//时间间隔调用一次,你可以再次使用计时器为你做这件事privatevoidtimer_Tick(objectsender,EventArgse){myFunction();}祝你好运以上是C#学习教程:为什么使用System.Threading.Thread.Sleep()是一种不好的做法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
