因此Thread.Sleep()很差(http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx)。用於模擬暫停的Thread.Sleep()的替代方法
是否有任何推薦的替代方法來模擬程序執行中的暫停?例如循環?雖然我想這涉及到初始化變量,檢查布爾條件大量的開銷,等
感謝
因此Thread.Sleep()很差(http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx)。用於模擬暫停的Thread.Sleep()的替代方法
是否有任何推薦的替代方法來模擬程序執行中的暫停?例如循環?雖然我想這涉及到初始化變量,檢查布爾條件大量的開銷,等
感謝
我相信雷蒙德陳建議設置線程的優先級較低的
http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx
我不太明白你爲什麼想每隔一段時間都要停下來。爲什麼不以低優先級進行工作?當有更重要的事情要做的時候,你的後臺線程會停下來做任何事情。當有可用的CPU時,你的後臺線程會盡可能快地完成它的工作(直到具有更高優先級的東西到達)。
他的建議是關於「第三次」使用睡眠 - 減慢操作速度並且不佔用太多CPU時間。問題是關於模擬暫停,這是Thread.Sleep的完美使用。文章中給出的第二種用法討論的是投票 - 這很糟糕。 – configurator 2009-09-21 23:44:46
我不同意Thread.Sleep()
是「壞」的評估。這取決於實際情況。
在控制檯模式程序中,如果您正在等待某些內容,則可能非常適合睡覺該線程。也許甚至在一個循環中:檢查條件,如果不滿意,重複睡一會兒。
然而,在圖形程序中,通常你不會睡在主(GUI)線程上。這是因爲這些日子的GUI界面都是用一個交互式線程來設計的。如果你睡在那個線程上,你的整個圖形用戶界面就會在你睡覺的時候「鎖定」。更好的情況可能是使用某種計時器(所有GUI框架都有這樣的概念)。
你做的一件事不是想要做的是寫一個循環,不斷檢查某些條件是否爲真,甚至沒有睡覺。這將導致一個CPU運行高達100%,因爲CPU希望儘快完成其工作。這不僅從用戶的角度出乎意料,而且也不友好,因爲這樣的活動可能會讓您實際上等待足夠的週期,以致於的工作完成!
從你說的話,你試圖模擬執行中的暫停。
Thread.Sleep對此非常有效。即使您鏈接的文章開始於:
Thread.Sleep有它的用途:在MTA線程上測試/調試時模擬冗長的操作。
如果你只打算模擬暫停(如用於測試目的),我想了Thread.Sleep是一個完全有效的方法。另一方面,如果你真的在等待什麼,某種線程安全的信號機制會更好(檢查繼承WaitHandle
的類型)。
模擬暫停
「模擬」聽起來像你只在調試做。 Thread.Sleep
應該沒問題。
睡眠的主要問題是,通常您應該等待發生特定事件而不是等待任意延遲。
另一件需要注意的事情是從UI線程調用Thread.Sleep
,這將導致UI無響應。最好禁用不希望用戶與之交互的UI部分,然後使用Timer
控件來實現延遲。
這是一個完美的建議!它在我的程序中以他們想要的方式工作。在我移動到另一部分程序之前,我只是添加了另一個計時器來等待指定的時間。 – AndHeCodedIt 2010-08-25 19:18:55
我使用System.Timers:
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
雖然文章本身是值得商榷的,我同意它的起始句,既解決您的關注
的Thread.Sleep有它的用途:模擬 冗長的操作,而 在MTA線程上測試/調試。 在.NET中,沒有其他理由使用 它。
我相信這是你所問的關於(模擬暫停),是主要使用Thread.sleep()方法的
我願意打賭,在大多數情況下,其中一個程序員認爲的使用Thread.Sleep(),使用event
s的一些簡單代碼將工作得很好。
我想upvote那篇文章,但我不能。 StackOverflow已經毀了我的其他互聯網。 – MusiGenesis 2009-09-21 23:07:39
我希望這篇文章能夠解釋爲什麼在連續工作循環中使用100%cpu是Thread.Sleep(1)的首選替代方法。 – StingyJack 2017-04-02 18:28:03