2010-12-04 34 views
2

我創建了一個新線程。這裏是一個線程方法的代碼:如何減少線程中無限循環期間的處理器使用率?

while (true) 
{ 
    if (!showHelp) 
    { 
     Console.Clear(); 
     Console.WriteLine("=============================================="); 
     Console.WriteLine(player.PlayList.CurrentTrack().Artist + " " 
          + player.PlayList.CurrentTrack().Title + " " 
          + player.PlayList.CurrentTrack().Genre.ToString()); 
     Console.WriteLine(" [ " + pos.Duration() + "/" 
          + player.PlayList.CurrentTrack().Length + " ] "); 
     Console.WriteLine("==============================================="); 
    } 

    Thread.Sleep(1000); 

    if (isPlaying) 
     pos += TimeSpan.FromSeconds(1); 

    if (pos > player.PlayList.CurrentTrack().Length) 
    { 
     pos = TimeSpan.Zero; 
     player.Next(); 
    } 
} 

我想改變在控制檯當前軌道位置。每次迭代,我都會休息1秒,然後加1秒到位置。

我在無限循環中執行它,並且我的處理器似乎處於50%的負載下。

我應該怎麼做才能減少循環迭代之間處理器上的負載?

+4

如果存在Thread.Sleep,則不應占用50%?你確定它是*這個線程佔用所有的CPU時間嗎? – Kos 2010-12-04 15:44:43

+0

你確定你只有1個線程? – Codecat 2010-12-04 15:45:44

回答

2

看起來CPU負載更有可能是由於正在播放的媒體而非此代碼造成的。

您是否擁有雙核或超線程CPU?在這種情況下,50%(例如在Perfmon中)對應於一個完全使用的CPU - 這可能是媒體播放器 - 這意味着您的代碼在本質上是空閒的。當你每次睡1秒鐘時,這就是你所期望的 - 這在CPU方面是永恆的。

媒體播放是一個非常耗費CPU資源的過程,除了點擊「停止」或「暫停」之外,您可以做的並不多。

2

爲什麼不使用Timer更新當前位置,並使用Stopwatch或僅使用常規DateTime來測量已用時間。

這樣你就沒有無限循環了。