Я привык использовать Parallel.For () в параллельных расширениях .Net, поскольку это простой способ распараллеливания кода без необходимости вручную запускать и поддерживать потоки (что может быть сложным). Сейчас я смотрю на бесконечный цикл (делайте что-то, пока я не сообщу об этом, чтобы остановить), который я хочу распараллелить, нет перегрузки без параллелизма Parallel.For (), чтобы сделать это, поэтому мне было интересно, какой лучший подход здесь будет быть. В принципе я мог бы просто сделать что-то вроде:
Parallel.For(0, int.Max)
Но я подозреваю, что это может быть не ожидаемый / эффективный шаблон для обработки логики разбиения работы (?)
Другой вариант - что-то вроде:
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
Но это кажется не элегантным и может также привести к неэффективному разделению работы.
Прямо сейчас мой инстинкт состоит в том, чтобы делать это вручную, создавая и поддерживая мои собственные темы, но мне было бы интересно получить некоторые отзывы / мнения по этому вопросу. Спасибо.
=== ОБНОВЛЕНИЕ ===
Я использую упрощенную версию кода из статьи в принятом ответе (я удалил параметр ParallelOptions). Вот код ...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
Пример использования:
Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
// Do stuff.
});