Раньше я использовал следующий код:Лучший способ запустить 200 потоков в C#
for (int i = 0; i < config.threads; i++)
{
Thread thread = new Thread(workThread);
thread.IsBackground = true;
thread.Start();
}
public static void workThread()
{
while (true)
{
// work, 10 second
}
}
Он отлично работает, но после 10-15 циклов, начинает работать меньше. Тогда я написал класс для создания отдельных нитей:
class ThreadsPool
{
private static int maxThreads = 0;
private static Thread[] threadsArray;
private static int activeThread = 0;
public static void Initializer(int maxThreads)
{
ThreadsPool.maxThreads = maxThreads;
for (int i = 0; i < maxThreads; i++)
{
Thread thread = new Thread(Program.workThread);
thread.IsBackground = true;
thread.Start();
}
Thread threadDaemon = new Thread(Daemon);
threadDaemon.IsBackground = true;
threadDaemon.Start();
}
public static void activeThreadMinus()
{
Interlocked.Decrement(ref activeThread);
}
private static void Daemon()
{
while(true)
{
if(activeThread < maxThreads)
{
Thread thread = new Thread(Program.workThread);
thread.IsBackground = true;
thread.Start();
}
Thread.Sleep(5);
}
}
public static void workThread()
{
while (true)
{
// work 10 sec
ThreadsPool.activeThreadMinus();
}
}
}
Но проблема в том, что этот класс создает утечку памяти. Вы понимаете, что мне приходится делать 10 секунд, почти бесконечное количество раз, иногда число запущенных потоков меняется. Как это можно сделать без утечек памяти и без потери производительности.
Сначала, что вы делаете, вам нужно до 200 потоков? Я думаю, что это проблема дизайна. Вы всегда будете получать проблемы с производительностью, если у вас есть 200 потоков. Никакой Prozessor не может справиться с этим быстро. – Sebi
Мне нужно обработать изображение. Я знаю, что потоки 200 не невозможны. – SavaLLL
Не ломайте 200 нитей. Разбить количество потоков, равное количеству ядер ЦП. –