我想這個問題可以歸結爲「SpinWait vs. Block?」,但我想到可能有一個更有趣的答案,爲什麼幾乎每個C#線程教程提出以下電話:在等待新線程產生時調用thread.sleep()
Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) ;
Thread.Sleep(1); // Allow the new thread to do some work
相對於阻塞,像這樣:
Thread newThread = new Thread(new ThreadStart(ThreadMethod));
newThread.Start()
while (!newThread.isAlive()) Thread.Sleep(1);
Thread.Sleep(1); // Allow the new thread to do some work
我非常強力測試(與周邊調用DateTime.Ticks while循環)並沒有真正顯示任何東西(說在兩種情況下差異是0滴答)。
線程創建過程是否足夠短以至於旋轉效率更高?或者大多數教程都建議旋轉,因爲它稍微更優雅,時間差異可以忽略不計?
的。一些資源(例如Windows消息隊列)綁定到創建它們的線程,因此不能在ctor中分配 - 它們必須由新線程分配。如果ctor不等待新線程分配這些資源,那麼線程可能會被要求執行一個將失敗的動作,因爲它尚未輪到分配資源。按照Dani的建議,將事件傳遞給線程是可以的。 – 2011-06-16 08:20:20