我在编写高质量多线程代码方面的知识不是很丰富。最近我开始参与一个需要用到这方面技术的项目。我编写了下面的代码,它能够按照我的要求工作,但是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();
我更新了代码,展示了我希望的所需内容。traversals集合仅包含6个项目。计数器是为了确保线程在traversals集合中旋转每个6个项目。CallHelper类只是在每个遍历上执行非常长时间的任务。该应用程序旨在使用可配置的线程数量和可配置的时间量在6个不同的对象上执行长时间运行的任务。希望我已经填好了足够的空白。
CallHelper().Migrate
是做什么用的?counter
的目的是什么?为什么要使用while
循环和for
循环来生成线程? - Ron Beyer