2010-12-04 51 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来测量已用时间。

这样你就没有无限循环了。