2011-01-19 4 views
0

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

Поскольку это выполняется внутри приложения 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 ....... 
    } 
}); 
+2

Я считаю, что принцип YAGNI (вы его не нужен) может быть взвинчен до «Если он не сломался, не исправляйте его» :) –

+0

Я с тобой Дейв. Поскольку я новичок в использовании Parallel extensions, я просто хочу, чтобы я не строил что-то, у кого есть скрытые гремлины, скрывающиеся где-то, о чем я еще не знаю. Ничего хуже, чем построить мост, который, по вашему мнению, заслуживает доверия, только для того, чтобы понять, что вы стоите на земле. – BonanzaDriver

ответ

2

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

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

+0

Я действительно верю, что это просто. Я рад, что наткнулся на новую технику, но если мой имп будет работать без каких-либо неизвестных загадочных проблем, то все лучше. Спасибо, Том. – BonanzaDriver

Смежные вопросы