Thread.Sleep()的替代方案,用于模拟暂停
所以Thread.Sleep()很糟糕( http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx )。
是否有任何建议的替代方法来模拟程序执行中的暂停? 如循环? 虽然我认为这在初始化变量,检查bool条件等方面涉及很多开销。
谢谢
如果你只想模拟暂停(就像测试目的一样),我认为Thread.Sleep是一种非常有效的方法。 另一方面,如果你实际上在等待什么,某种线程安全的信令机制会更好(检查inheritanceWaitHandle
的类型)。
模拟暂停
“模拟”听起来像是你在调试时才会做的事情。 Thread.Sleep
应该没问题。
睡眠的主要问题是通常你应该等待特定的事情发生而不是等待任意延迟。
需要注意的另一件事是从UI线程调用Thread.Sleep
,这将使UI无响应。 最好禁用不希望用户与之交互的UI部分,然后使用Timer
控件来实现延迟。
根据你的说法,你试图模拟暂停执行。
Thread.Sleep完全有效。 甚至您链接的文章也会开头:
Thread.Sleep有它的用途:在MTA线程上测试/调试时模拟冗长的操作。
我不同意Thread.Sleep()
是“坏”的评估。 这取决于实际情况。
在控制台模式程序中,如果您正在等待某事,可能完全适合睡眠线程。 也许即使在一个循环中:检查条件,如果不满意就睡一会儿,重复一遍。
但是,在图形程序中,通常不会在主(GUI)线程上睡眠。 这是因为现在GUI界面设计有一个交互式线程。 如果你在那个线程上睡觉,你的整个GUI似乎会“锁定”你正在睡觉的时间。 更好的情况可能是使用某种计时器(所有GUI框架都有这样的概念)。
你不想做的一件事是写一个循环,不断检查某些条件是否为真,甚至没有睡觉。 这将导致一个CPU运行高达100%,因为CPU希望尽快完成其工作。 从用户的角度来看,这不仅是意料之外的,而且它不友好,因为这样的活动可能会使你正在等待足够周期来完成工作的过程挨饿!
如果您正在等待某些代码或事件发生,则可以使用等待句柄。
虽然这篇文章本身值得商榷,但我同意它的起始句,它解决了你的问题
Thread.Sleep有它的用途:在MTA线程上测试/调试时模拟冗长的操作。 在.NET中,没有其他理由可以使用它。
我相信这就是你所要求的(模拟暂停)并且是Thread.Sleep()的主要用途
我使用System.Timers:
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
我相信Raymond Chen建议将线程优先级设置得更低
http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx
我不太明白为什么你要经常停下来。 为什么不以低优先级进行工作? 当有更重要的事情要做时,你的后台线程将停止做它正在做的事情。 当有可用的CPU时,您的后台线程将尽可能快地执行其操作(直到具有更高优先级的内容到达)。
我愿意打赌,在程序员认为使用Thread.Sleep()的大多数情况下,使用event
的一些简单代码可以很好地工作。