@Student2002
Как мне отдельно создать потоки чтоб они брали результат работы и обрабатывали ?
Пробовал сделать что-то вроде
private void Generator()
{
// Тут он её генерирует
string value = "Строка которую он сгенерировал в чуть выше";
Thread a = new Thread(new ParameterizedThreadStart(Get_Obrabotka));
a.Start(value);
}
Крашится System.OutOfMemoryException».»
Решения вопроса 1
@2ord
Комментировать
Ответы на вопрос 4
@kttotto
Если у Вас есть некий список, с которым работает много потоков, то рассмотрите возможность использования потокобезопасных коллекций. List
не потокобезопасен.
Если у Вас большой объем данных, который не влазит в память, то только подгружать данные частями, если хотите добавить параллельную обработку этих данных в разных потоках, то ,возможно, Вам подойдет Parallel.ForEach.
И да, нет необходимости добавлять 100 потоков, как уже сказали, такое кол-во в кол-во ядер не влезет и производительности это не добавит, а даже наоборот, т.к. одно ядро будет делить время на часть выделенных потоков и будет переключать контекст между ними. Не факт, конечно, что даже два потока будут разделены по ядрам, за это ОС отвечает, но 100 потоков, это кажется перебором. Можно, конечно поэкспериментировать с кол-вом и посмотреть на производительность при этом.
@MANAB
@soloveid
Скорее всего генерация строк идёт быстрее чем их обработка.
И скорее всего идёт неправильная (не оптимальная по памяти и производительности)
обработка, возможно вообще всё может работать сильно быстрее и без всяких потоков.
@cicatrix
Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
То, что ты описал, подходит под паттерн — производитель-потребитель.
Пример реализации