Parallel.ForEach () .... как лучше завершить цикл извне? - PullRequest
0 голосов
/ 19 января 2011

У меня есть приложение, с помощью которого я загружаю и обрабатываю приблизительно 7800 URL-адресов, используя цикл Paraller.ForEach ().Использование этой техники позволило моему компьютеру завершить эту операцию примерно за 4,5 минуты (в среднем это занимает почти 28 минут).

Поскольку это выполняется внутри приложения WinForms, я позволяю пользователю «остановить» процесс раньше, просто нажав кнопку «стоп», которая, в свою очередь, установит для изменчивой логической переменной значение «false».В верхней части моего цикла Parallel.ForEach () я проверяю состояние этой переменной, и если для нее установлено значение «false», я просто вызываю метод ParallelLoopState.Stop ().Мой следующий блок кода внутри цикла выполняется только в том случае, если ParallelLoopState не был остановлен.

Прекрасно работает.За 3 недели использования этой реализации я не испытывал никаких проблем с использованием этой реализации.

Но я только что прочитал и наткнулся на классы «CancellationTokenSource» и «CancellationToken» и обнаружил, что они предназначены для выполнения, по сути, одного и того же действия…, чтобы позволить параллельному циклу отменяться извне.

Может кто-нибудь сказать мне, если они предвидят проблему со мной, продолжающим использовать мою существующую реализацию?

Parallel.ForEach(searchList, (url, state) =>
{
    if (!this.isSearching)
    {
        state.Stop();

        OnSearchEvent(new SearchStatusEventArgs(SearchState.STOP_REQUESTED, ......));
    }

    if (!state.IsStopped)
    {
        // continue on with regular processing .......
    }
});

1 Ответ

2 голосов
/ 19 января 2011

выглядит хорошо для меня!CancellationTokenSource и CancellationToken действительно предназначены для использования с Задачами , особенно если задачи связаны друг с другом через ContinueWith.Оттуда вы можете опросить токен (потокобезопасный) и сгенерировать исключение или выйти из потока в точно так же, как вы уже делаете это.

Если вы не пойдете по маршрутусложная цепочка задач и замыкания, тогда я бы сказал, что нет необходимости усложнять вещи!

...