2015-09-29 2 views
0

У меня есть параллельный цикл foreach, запущенный внутри события на веб-странице asp.net. Как я могу отменить его с помощью токена отмены? Это может быть очень длинная операция - и меня беспокоит - кажется, что она отправляется обратно во время выполнения операции - так как я могу вызвать другое событие для использования токена отмены? Это возможно?Параллельный цикл ForEach Отмена в событии

protected void btnSend_Click(object sender, EventArgs e) 
{ 
    mailList = tbEmailTo.Text.Split(
     new string[] { "," }, 
     StringSplitOptions.RemoveEmptyEntries).ToList(); 
    Parallel.ForEach(emailList, email => 
    { 
     //just sending email 
    }); 
} 
+0

Как насчет этого? http://stackoverflow.com/a/4676238/993547 –

+0

Я не вижу каких-либо событий (-ов) в этом коде? – JohnCoderMan

+0

Вам не нужен этот 'ToList' после' Split'. 'Parallel.ForEach' будет работать так же хорошо с массивом. – juharr

ответ

1

Передайте вам Parallel.ForEach CancellationToken и проверьте внутри своей петли, если требуется аннулирование. Если он запрошен, он будет генерировать исключение и выйти из цикла. Вызов

cts.Cancel(); 

из-за пределы контура будет установлено CancellationToken отменить состояние и он будет бросать исключение внутри вашего цикла Parallel.ForEach.

CancellationTokenSource cts = new CancellationTokenSource(); 
ParallelOptions po = new ParallelOptions(); 
po.CancellationToken = cts.Token; 

try 
{ 
    Parallel.ForEach(emailList, po, (email) => 
    { 
     //just sending email here 

     po.CancellationToken.ThrowIfCancellationRequested(); 
    }); 
} 
catch (OperationCanceledException e) 
{ 
} 
finally 
{ 
    cts.Dispose(); 
} 
+0

Вот что я не понимаю - как я могу запустить событие во время обратной передачи, чтобы сказать, что вещь отменила? – JohnCoderMan

+0

Это не приложение для окон – JohnCoderMan

+0

@JohnAshton, пожалуйста, взгляните на это сообщение http://forums.asp.net/t/1786513.aspx?Cancel+Thread+process+CancellationToken+not+working Они используют ASP .NET для отмены долговременной задачи из webforms –

0

Ну, это определенно не отменяет отправку части вашего параллельного цикла, поскольку этот код не знает или не понимает ваш токен отмены. Если вам нужна возможность немедленно прекратить, а не грациозную отмену, вам следует рассмотреть возможность кодирования ваших собственных потоков, чтобы вы могли убить весь поток. Или, по крайней мере, используйте другую библиотеку, которая запускает ваш код в своем собственном потоке, возможно, что-то вроде частного пула потоков.

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