所以Thread.Sleep()不好(http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx)。
是否有任何建议的替代方法来模拟程序执行中的暂停?比如一个循环?虽然我认为这在初始化变量,检查bool条件等方面需要很多开销。
由于
答案 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)
我使用System.Timers:
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
答案 8 :(得分:0)
我愿意打赌,在程序员认为使用Thread.Sleep()的大多数情况下,一些使用event
的简单代码都可以正常工作。