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

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"等需要很长时间?这对我来说没有意义.我想知道出了什么问题?

Ser*_*rvy 7

Sleep在再次激活线程之前至少会等待很长时间,但它总是比这长.经过一秒钟后,线程就有资格由CPU调度程序执行,并且调度程序能够随时运行它.如果它特别繁忙,和/或正在使用不专注于快速允许新活动线程运行的调度算法,则可能需要一段时间.


Eri*_*ert 5

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)

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

  • @nintendojunkie:"Sleep"不是方法设计的一个很好的例子.它有特殊用途的案例; 例如,Sleep(0)`的含义与'Sleep(1)`有很大的不同.据记载,它没有提供实际睡眠时间的保证; 它可以比给出的论点或多或少地睡觉.它不会提取消息,因此它会在应用程序中引入挂起.它完全浪费了一个线程,一个昂贵的资源.它几乎从来没有正确使用过,除非你有一个真正令人信服的理由使用它,否则它应该被避免. (2认同)