Я привык использовать Parallel.For () в параллельных расширениях .Net, поскольку это простой способ распараллеливания кода без необходимости вручную запускать и поддерживать потоки (что может быть неудобно). Теперь я смотрю на бесконечный цикл (сделайте что-нибудь, пока я не подам сигнал об остановке), который я хочу распараллелить, для этого нет перегрузки Parallel.For () без аргументов, поэтому мне было интересно, какой здесь лучший подход быть. В принципе, я мог бы просто сделать что-то вроде:
Parallel.For(0, int.Max)
Но я подозреваю, что это может быть не ожидаемый / эффективный шаблон для обработки логики разделения работы (?)
Другой вариант - что-то вроде:
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
Но это кажется неэлегантным и может также привести к неэффективному разделению работы.
Сейчас я склонен делать это вручную, создавая и поддерживая свои собственные темы, но мне было бы интересно получить отзывы / мнения по этому поводу. Спасибо.
=== UPDATE ===
Я использую упрощенную версию кода из статьи в принятом ответе (я удалил параметр 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.
});