C#Thread.Sleep(1000)在某些电脑上花费的时间超过1000毫秒

我写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(); 

这可以在我的电脑上运行,但是,当我将程序复制到平板电脑时,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); } 

或者,创建一个具有计时器和计数器的类,启动计时器每秒勾选几次,将当前时间与上次更新标签的时间进行比较,如果超过一秒,则更新标签。