Представьте длинный список данных для обработки. Обработка связана с процессором и может выполняться параллельно.Использование потоков-локальных ресурсов с параллельными для циклов
Для обработки элемента данных требуется большой объект (~ 50 МБ) для хранения промежуточных результатов обработки. Этот объект может быть повторно использован во время обработки последующей задачи.
Я хочу сделать что-то вроде этого:
Processor[] processors = GetProcessors(Environment.ProcessorCount);
Parallel.For(
0,
itemCount,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
item =>
{
int threadIndex = /* TODO */;
processors[threadIndex].Process(item);
}
);
Цель состоит в том, чтобы только когда-либо Environment.ProcessorCount
экземпляры моего большого объекта, и использовать их как можно более эффективно.
Как это сделать?
Выглядит интересно. К сожалению, в моем конкретном случае у меня есть внешний цикл с этим параллельным циклом внутри. Мне нужно повторно использовать объекты во всех итерациях внешнего цикла. Я попытался использовать перегрузку, которую вы показываете, чтобы назначать целые индексы для потоков, но это не сработало. Но ваш ответ, вероятно, является идеальным сценарием для тех, кому не нужно повторно использовать ресурсы так, как я. Я мог бы объединить две петли в одну, но это сделает код нечитаемым. Внешний цикл работает порядка 10 раз, а внутренний - 1000 раз. –