C#多线程代码中的高CPU使用率

时间:2015-11-11 16:29:15

标签: c# multithreading cpu-usage

我在编写好的多线程代码方面没有太多的知识。我刚刚开始研究一个必要的项目。我编写了以下代码,它按照我的要求运行,但CPU使用率非常高。我假设它是由于我如何使用线程。如果有人能够指出下面代码中的缺陷并让我知道如何修复它以便CPU使用率不是很高,我将非常感激。

var numberOfMinutes = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfMinutesToRun"]);
var traversals = DbLayer.GetTraversals().ToList();
var numberOfThreads = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfThreads"]);
var threads = new List<Thread>(numberOfThreads);
var counter = 1;
var s = new Stopwatch();
s.Start();
var sync = new object();
while (s.Elapsed < TimeSpan.FromMinutes(numberOfMinutes))
{
    for (var i = 0; i < (numberOfThreads - threads.Count); i++)
    {
        var counter1 = counter; // due to closure.
        var traversal = traversals.FirstOrDefault(t => t.Id == counter1);
        var threadStart = new ThreadStart(new CallHelper(traversal).Migrate);
        var i1 = i;
        threadStart += () =>
                       {
                            threads.RemoveAt(i1);
                       };
        threads.Insert(i, new Thread(threadStart) {IsBackground = true});
        threads[i].Start();
        lock (sync)
        {
            counter++;
            if (counter > 6)
            {
                counter = 1;
            }
        }
    }
}
s.Stop();

我更新了代码以显示,我希望,需要帮助我。遍历集合仅包含6个项目。计数器用于确保线程在遍历集合中的每个项目中旋转。 CallHelper类只是在每次遍历上执行一个非常长时间运行的任务。该应用程序旨在使用可配置数量的线程在6个不同的对象上执行长时间运行的任务,并且可配置的时间量。希望我填补了足够的空白。

1 个答案:

答案 0 :(得分:0)

有许多资源可用于编写good和高效的多线程代码。 “好”通常指的是工作和健壮的代码。要获得高效代码,请使用embedded资源。

我只扫描了您的代码,但可以看到各种问题,并可以提供建议。

  1. 使用线程池。构建和拆除线程非常昂贵。
  2. 尽可能不频繁地重复循环(如上所述)。
  3. 当您需要延迟时,请使用睡眠而不是繁忙的循环。
  4. 使用非平凡的代码来测试效率。如果您正在测试琐碎的代码,那么您的利用率将由程序(不仅仅是线程)设置和拆除来控制,这是非常昂贵的并且将主导CPU利用率。
  5. 衡量您感兴趣的代码的利用率,并排除您不感兴趣的代码,例如应用程序设置和拆除。