我正在编写一个应用程序,通过一个复杂的API处理一个庞大而丑陋的第三方系统。 有时在系统中会发生一些错误,但如果我们等待我的程序面对这些错误,那就太晚了。
所以,我使用一个单独的线程检查系统状态如下:
while (true)
{
ask_state();
check_state();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}
如果我在100毫秒或每分钟检查一次系统状态并不重要。
但我听说使用Thread.Sleep()是一种不好的做法。为什么?在这种情况下我该怎么办?
答案 0 :(得分:5)
一个原因是Thread.Sleep()
阻止您的代码执行任何其他操作。最近的努力是尽可能地阻止阻塞。例如,node.js是一种非阻塞语言。
更新:我不知道C#中Timer
类的基础结构。也许它也会阻塞。
您可以安排任务每100毫秒检查一次第三个API。这样,在100毫秒期间,您的程序可以执行其他任务。
更新:这个比喻可能会有所帮助。如果我们将操作系统与医院进行比较,并将线程与该医院的护士进行比较,那么主管(程序员)可以选择一个策略:
Sleep()
方法)第一个模型是阻止。它不可扩展。但在第二种模式中,即使护士很少,也可以为很多患者服务。
答案 1 :(得分:3)
因为如果它在Sleep
内等待,关闭此线程的唯一方法是a)等待Sleep
结束,或b)使用Thread.Abort
之一或Thread.Interrupt
1
如果是长时间睡眠,那么(a)如果你想要做出反应就不太适合。并且(b)如果代码发生 而不是实际上在Sleep
内,则非常讨厌。
如果您希望能够以合适的方式中断睡眠行为,使用可等待的对象(例如ManualResetEvent
),那就更好了 - 您甚至可以放置等待将waitable对象放入while
条件中,以明确将导致该线程退出的内容。
1 我在这个实例中使用了shutdown,因为这是一个非常常见的场景,需要进行跨线程通信。但是对于任何其他跨线程信令或通信,相同的参数也可以应用,如果不关闭,则Thread.Abort
或Thread.Interrupt
更不合适。
答案 2 :(得分:0)
我会设置一个计时器到你想要的任何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();
}
祝你好运