Каков наилучший способ создания параллельного бесконечного цикла?

Я привык использовать 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.


});
9
задан redcalx 31 December 2011 в 11:29
поделиться