2009-09-21 38 views
20

因此Thread.Sleep()很差(http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx)。用於模擬暫停的Thread.Sleep()的替代方法

是否有任何推薦的替代方法來模擬程序執行中的暫停?例如循環?雖然我想這涉及到初始化變量,檢查布爾條件大量的開銷,等

感謝

+9

我想upvote那篇文章,但我不能。 StackOverflow已經毀了我的其他互聯網。 – MusiGenesis 2009-09-21 23:07:39

+0

我希望這篇文章能夠解釋爲什麼在連續工作循環中使用100%cpu是Thread.Sleep(1)的首選替代方法。 – StingyJack 2017-04-02 18:28:03

回答

0

我相信雷蒙德陳建議設置線程的優先級較低的

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

我不太明白你爲什麼想每隔一段時間都要停下來。爲什麼不以低優先級進行工​​作?當有更重要的事情要做的時候,你的後臺線程會停下來做任何事情。當有可用的CPU時,你的後臺線程會盡可能快地完成它的工作(直到具有更高優先級的東西到達)。

+0

他的建議是關於「第三次」使用睡眠 - 減慢操作速度並且不佔用太多CPU時間。問題是關於模擬暫停,這是Thread.Sleep的完美使用。文章中給出的第二種用法討論的是投票 - 這很糟糕。 – configurator 2009-09-21 23:44:46

2

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

+0

你甚至可以用等待句柄來代替Thread.Sleep(time)來做週期邏輯。 – Alan 2009-09-21 22:59:29

3

我不同意Thread.Sleep()是「壞」的評估。這取決於實際情況。

在控制檯模式程序中,如果您正在等待某些內容,則可能非常適合睡覺該線程。也許甚至在一個循環中:檢查條件,如果不滿意,重複睡一會兒。

然而,在圖形程序中,通常你不會睡在主(GUI)線程上。這是因爲這些日子的GUI界面都是用一個交互式線程來設計的。如果你睡在那個線程上,你的整個圖形用戶界面就會在你睡覺的時候「鎖定」。更好的情況可能是使用某種計時器(所有GUI框架都有這樣的概念)。

你做的一件事不是想要做的是寫一個循環,不斷檢查某些條件是否爲真,甚至沒有睡覺。這將導致一個CPU運行高達100%,因爲CPU希望儘快完成其工作。這不僅從用戶的角度出乎意料,而且也不友好,因爲這樣的活動可能會讓您實際上等待足夠的週期,以致於工作完成!

+2

這就是同步原語的用途。這就是博文的全部內容。 – ebo 2009-09-21 22:57:57

+0

但是「模擬暫停執行程序」並不是同步原語的目的。這是**問題**的重點。 – 2009-09-21 22:59:52

+1

但是你正在寫它可以用來進行通信,事實並非如此。 – ebo 2009-09-21 23:02:13

4

從你說的話,你試圖模擬執行中的暫停。

Thread.Sleep對此非常有效。即使您鏈接的文章開始於:

Thread.Sleep有它的用途:在MTA線程上測試/調試時模擬冗長的操作。

12

如果你只打算模擬暫停(如用於測試目的),我想了Thread.Sleep是一個完全有效的方法。另一方面,如果你真的在等待什麼,某種線程安全的信號機制會更好(檢查繼承WaitHandle的類型)。

6

模擬暫停

「模擬」聽起來像你只在調試做。 Thread.Sleep應該沒問題。

睡眠的主要問題是,通常您應該等待發生特定事件而不是等待任意延遲。

另一件需要注意的事情是從UI線程調用Thread.Sleep,這將導致UI無響應。最好禁用不希望用戶與之交互的UI部分,然後使用Timer控件來實現延遲。

+0

這是一個完美的建議!它在我的程序中以他們想要的方式工作。在我移動到另一部分程序之前,我只是添加了另一個計時器來等待指定的時間。 – AndHeCodedIt 2010-08-25 19:18:55

1

雖然文章本身是值得商榷的,我同意它的起始句,既解決您的關注

的Thread.Sleep有它的用途:模擬 冗長的操作,而 在MTA線程上測試/調試。 在.NET中,沒有其他理由使用 它。

我相信這是你所問的關於(模擬暫停),是主要使用Thread.sleep()方法的

0

我願意打賭,在大多數情況下,其中一個程序員認爲的使用Thread.Sleep(),使用event s的一些簡單代碼將工作得很好。