为什么使用System.Threading.Thread.Sleep()是一种不好的做法?
我正在编写一个应用程序,通过一个复杂的API处理一个庞大而丑陋的第三方系统。 有时系统会发生一些错误,但如果我们等待我的程序面对这些错误,那就太晚了。
所以,我使用一个单独的线程来检查系统状态如下:
while (true) { ask_state(); check_state(); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1)); }
如果我在100毫秒或每分钟检查一次系统状态并不重要。
但我听说使用Thread.Sleep()是一种不好的做法。 为什么? 在这种情况下我该怎么办?
一个原因是Thread.Sleep()
阻止您的代码执行任何其他操作。 最近的努力是尽可能地阻止阻塞。 例如,node.js是一种非阻塞语言。
更新:我不知道C#中Timer
类的基础结构。 也许它也在阻塞。
您可以安排任务每100毫秒检查一次第三个API。 这样,在100毫秒内,您的程序可以执行其他任务。
更新:这个类比可能会有所帮助。 如果我们将操作系统与医院进行比较,并将线程与该医院的护士进行比较,那么主管(程序员)可以选择一个策略:
- 要么是要求每个护士(线程)看一个,只有一个病人(一个工作,一个要完成的任务),即使每次检查之间她等待一个小时(
Sleep()
方法) - 要求每位护士检查每位患者,并在间隔期间直到下次检查,继续检查其他患者。
第一个模型是阻止。 它不可扩展。 但在第二个模型中,即使护士很少,您也许可以为很多患者服务。
因为如果它在Sleep
内部等待,关闭此线程的唯一方法是a)等待Sleep
结束,或者b)使用Thread.Abort
或Thread.Interrupt
。 1
如果这是一个长时间的睡眠,那么(a)如果你想要做出反应就不太适合。 并且(b)如果代码实际上并非当时在Sleep
,则非常令人讨厌。
如果你想以合适的方式中断睡眠行为,使用一个可等待的对象(例如一个ManualResetEvent
),你可能会更好,你甚至可以将等待放在等待的对象上有条件的,要明确什么会导致线程退出。
1我在这个实例中使用了shutdown,因为这是一个非常常见的场景,需要进行跨线程通信。 但是对于任何其他跨线程信令或通信,相同的参数也可以应用,如果它不是关闭,那么Thread.Abort
或Thread.Interrupt
甚至不太合适。
我会设置一个计时器到你想要的任何ms并等待我的检查方法完成,顺便说一下你想使用一个永恒的循环,或者它不是你出现在那里的完整代码?
好的,这是我正在谈论的样本:
public void myFunction() { int startCount = Environment.TickCount; ask_state(); check_state(); while (true) { if (Environment.TickCount - startCount >= 20000) //two seconds { break; } Application.DoEvents(); } } //Now you have an organized function that makes the task you want just call it every // time interval, again you can use a timer to do that for you private void timer_Tick(object sender, EventArgs e) { myFunction(); }
祝好运
上述就是C#学习教程:为什么使用System.Threading.Thread.Sleep()是一种不好的做法?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1039376.html