我正在写一个应用程序,通过一个复杂的API使用一个庞大而丑陋的第三方系统。有时系统中会发生一些错误,但如果我们等待我的程序面对这些错误,就会为时已晚。
因此,我使用一个单独的线程来检查系统状态,如下所示:
while (true)
{
ask_state();
check_state();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
}我是每100毫秒检查一次系统状态,还是每分钟检查一次,这都无关紧要。
但我听说使用Thread.Sleep()是一种糟糕的做法。为什么?在这种情况下我能做些什么呢?
发布于 2013-11-15 15:45:51
其中一个原因是Thread.Sleep()正在阻止您的代码执行其他任何操作。最近的努力是使阻塞尽可能少。例如,node.js是一种非阻塞语言。
更新:我不知道C#中 Timer 类的基础结构。也许它也被阻塞了。
您可以安排一个任务每隔100ms检查一次第三个API。这样,在这100ms内,您的程序可以执行其他任务。
更新:这个类比可能会有所帮助。如果我们将操作系统与医院进行比较,并将线程与医院中的护士进行比较,主管(程序员)可以选择一个策略:
Sleep()方法)第一个模型是阻塞。它是不可伸缩的。但在第二种模式中,即使只有很少的护士,你也可以为许多患者提供服务。
发布于 2013-11-15 15:50:06
我会设置一个计时器到你想要的任何ms,并等待我的check方法完成,顺便说一句,你是想使用一个永恒的循环,还是你在那里显示的不是一个完整的代码?
好的,这是我所说的一个例子:
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();
}祝好运
https://stackoverflow.com/questions/19995938
复制相似问题