Parallel.ForEach не возвращается после loopResult.Stop () - PullRequest
1 голос
/ 31 марта 2012

Вот как выглядит мой цикл:

var loopResult = Parallel.ForEach(folder.Items.Cast<object>(), (item, loopState) =>
    {
        if (!loadData)
        {
            loopState.Stop();
            return;
        }

        DoSomeWork(item);
    }
);

if (loopResult.IsCompleted)
{
    Debug.WriteLine("done");
}

Проблема в том, что код никогда не доходит до if (loopResult.IsCompleted). После выполнения return; для всех различных потоков абсолютно ничего не происходит.

Ответы [ 2 ]

4 голосов
/ 31 марта 2012

Код никогда не попадает в тело if (loopResult.IsCompleted), потому что параллельный цикл был успешно остановлен.Вы можете проверить это следующим образом:

/* ForEach loop as above */

if (!loopResult.IsCompleted && 
         !loopResult.LowestBreakIteration.HasValue)
{
   Debug.WriteLine("Loop was stopped");
}

if (loopResult.IsCompleted)
{
    Debug.WriteLine("Loop was done without stopping");
}

Вы можете найти полезную информацию о том, как Stop/Break параллельный цикл в этой странице MSDN , начиная с Раннее прерывание циклов подраздел.

2 голосов
/ 31 марта 2012

Согласно this , IsCompleted не вернет true, если цикл завершился преждевременно:

Получает, завершился ли цикл до завершения, так что все итерацииЦикл был выполнен, и цикл не получил запрос на преждевременное завершение.

Ваш вызов Stop() заставляет все остальные циклы досрочно завершиться , что приводит к IsCompletedоценка ложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...