Thread.Sleep()的替代方案,用于模拟暂停

时间:2009-09-21 22:47:45

标签: c#

所以Thread.Sleep()不好(http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx)。

是否有任何建议的替代方法来模拟程序执行中的暂停?比如一个循环?虽然我认为这在初始化变量,检查bool条件等方面需要很多开销。

由于

9 个答案:

答案 0 :(得分:12)

如果您只是模拟暂停(就像测试目的一样),我认为Thread.Sleep是一种非常有效的方法。另一方面,如果你实际上正在等待什么,某种线程安全的信令机制会更好(检查继承WaitHandle的类型)。

答案 1 :(得分:6)

  

模拟暂停

“模拟”听起来就像你只在调试中做的事情。 Thread.Sleep应该没问题。

睡眠的主要问题是通常你应该等待特定的事情而不是等待任意延迟。

要注意的另一件事是从UI线程调用Thread.Sleep,这将使UI无响应。最好禁用不希望用户与之交互的UI部分,然后使用Timer控件来实现延迟。

答案 2 :(得分:4)

根据你的说法,你试图模拟暂停执行。

Thread.Sleep完全有效。甚至您链接的文章都以:

开头
  

Thread.Sleep有它的用途:在MTA线程上测试/调试时模拟冗长的操作。

答案 3 :(得分:3)

我不同意Thread.Sleep()“不好”的评估。这取决于具体情况。

在控制台模式程序中,如果您正在等待某事,可能完全适合睡眠线程。也许即使在一个循环中:检查条件,如果不满意就睡一会儿,重复。

但是,在图形程序中,通常您不会在主(GUI)线程上睡眠。这是因为现在GUI界面设计有一个交互式线程。如果您在该线程上睡觉,您的整个GUI将显示为“锁定”您正在睡觉的时间。更好的情况可能是使用某种计时器(所有GUI框架都有这样的概念)。

你要做的一件事想要做的是写一个循环,不断检查某些条件是否为真,甚至没有睡觉。这将导致一个CPU运行高达100%,因为CPU希望尽快完成其工作。从用户的角度来看,这不仅是意料之外的,而且它不友好,因为这样的活动可能会让你正在等待足够周期的进程让 工作完成!

答案 4 :(得分:2)

如果您正在等待某些代码或事件发生,您可以使用等待句柄。

答案 5 :(得分:1)

虽然这篇文章本身存在争议,但我同意其起始句,它解决了你的问题

  

Thread.Sleep有它的用途:模拟   漫长的操作   在MTA线程上测试/调试。   在.NET中没有其他理由可以使用   它

我相信这就是你所要求的(模拟暂停)并且是Thread.Sleep()的主要用途

答案 6 :(得分:0)

我相信Raymond Chen建议将线程优先级设置为

http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx

  

我不太明白为什么你要经常停下来。为什么不把工作放在低优先级呢?当有更重要的事情要做时,你的后台线程将停止做它正在做的事情。当有可用的CPU时,你的后台线程会尽可能快地执行它的工作(直到有更高优先级的东西到达)。

答案 7 :(得分:0)

答案 8 :(得分:0)

我愿意打赌,在程序员认为使用Thread.Sleep()的大多数情况下,一些使用event的简单代码都可以正常工作。