У меня нет большого опыта написания хорошего многопоточного кода. Недавно я начал работать над проектом, где это необходимо. Я написал следующий код, который работает, как я хочу, однако, использование ЦП очень велико. Я предполагаю, что это связано с тем, как я использую потоки. Если кто-нибудь может указать на недостаток в приведенном ниже коде и дать мне знать, как исправить это, поэтому использование ЦП не так велико, я бы очень признателен.Высокое использование ЦП в многопоточном коде C#
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 предметов. Счетчик предназначен для обеспечения того, чтобы потоки вращались через каждый из 6 элементов в коллекции обходов. Класс CallHelper выполняет очень долгую задачу при каждом обходе. Приложение предназначено для выполнения долговременной задачи на 6 различных объектах с использованием настраиваемого количества потоков для настраиваемого времени. Надеюсь, я заполнил достаточно пробелов.
Просьба представить минимальный, полный и поддающийся проверке пример, который воспроизводит проблему. http://stackoverflow.com/help/mcve – Fabjan
Я не уверен, что этот код должен делать. Какова цель здесь? Что делает 'CallHelper(). Migrate' do? Какова цель «счетчика»? Почему вы используете цикл while и цикл 'for' для генерации потоков? –
Сколько потоков вы используете? и почтовый индекс о threadStart. –