如何在线程中的无限循环期间减少处理器使用?

时间:2010-12-04 15:38:43

标签: c# .net multithreading optimization cpu-usage

我创建了一个新线程。这是一个线程方法代码:

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%。

如何减少循环迭代之间处理器的负载?

2 个答案:

答案 0 :(得分:2)

CPU负载似乎更有可能是由于正在播放的媒体而不是此代码。

您是否拥有双核或超线程CPU?在这种情况下,50%(例如,在Perfmon中)对应于一个正在使用的CPU - 这可能是媒体播放器 - 这意味着您的代码在这里(基本上)是空闲的。这就是你一次睡1秒钟时所期望的 - 这在CPU方面是永恒的。

媒体播放是一个非常耗费CPU的过程,除了点击“停止”或“暂停”之外,您无法做很多其他事情。

答案 1 :(得分:2)

为什么不使用Timer来更新当前位置并使用Stopwatch或仅使用常规DateTime来衡量已用时间。

这样你首先就没有无限循环。