man*_*hon 0 c# multithreading sleep timer
我写ac#program倒计时5秒.我所做的是:
new Task(() =>
{
try
{
this.Invoke((Action)delegate()
{
label1.Text = "5"; // 4, 3, 2..etc
});
}
Thread.Sleep(1000);
}
catch
{
// form could be disposed
break;
}
}
}).Start();
Run Code Online (Sandbox Code Playgroud)
这可以在我的电脑上运行,但是,当我将程序复制到平板电脑时,Thread.Sleep(1000)给出的时间超过1秒.换句话说,从5,4,3,2,1更新标签需要5秒以上(实际上超过10秒).或者,更新label1.Text ="5"等需要很长时间?这对我来说没有意义.我想知道出了什么问题?
Sleep在再次激活线程之前至少会等待很长时间,但它总是比这长.经过一秒钟后,线程就有资格由CPU调度程序执行,并且调度程序能够随时运行它.如果它特别繁忙,和/或正在使用不专注于快速允许新活动线程运行的调度算法,则可能需要一段时间.
Servy的回答是正确的.有关详细信息,请阅读文档:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298.aspx
其中说明:
请注意,不保证立即运行就绪线程.因此,线程可能在睡眠间隔过去一段时间后才运行.有关更多信息,请参阅计划优先级.
优先权文件在这里:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms685100.aspx
但更普遍的是:你做错了什么.不要这样使用Sleep.如果您想等待一段时间,请使用计时器或使用Delay任务.永远不要在测试代码之外睡觉这样的线程.编写代码的正确方法可能就像
for (int countdown = 5; countdown > 0; countdown -= 1)
{
label1.Text = countdown.ToString();
await Task.Delay(1000);
}
Run Code Online (Sandbox Code Playgroud)
或者,创建一个具有计时器和计数器的类,启动计时器每秒勾选几次,将当前时间与上次更新标签的时间进行比较,如果超过一秒钟,则更新标签.