вложенный Parallel.For Loop - Cancellation.Token не работает - PullRequest
0 голосов
/ 24 августа 2011

У меня следующая проблема: у меня узкий цикл (специально), который запускается при событии click в MainWindow.cs моего приложения WPF.

Теперь событие останова, вызванное другой кнопкой, должно остановить замкнутый цикл и завершить задание.

В моем узком цикле у меня есть цикл Parallel.For. Идея состоит в том, что я должен делать определенное количество вещей одновременно (Parallel.For), и это снова и снова (узкий цикл). Я не знаю, является ли это лучшим подходом, но он единственный, который у меня был, однако он работает :).

У меня проблема с Cancellation.Token, который, похоже, ничего не делает. Как мне остановить цикл и правильно завершить задание.

Вот мой код:

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken token = cts.Token;

ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

Task dlTask = Task.Factory.StartNew( 
() =>
{
  do
  {
    Parallel.For(0, num, po, i => {
      if (!token.IsCancellationRequested)
      {
        // do work
      }
    });
  }
  while (!token.IsCancellationRequested);

}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

dlTask.ContinueWith(prev => 
{
     //clean up
}, uiScheduler);

Я попробовал это с po.CancellationToken.IsCancellationRequested и без, и это не остановилось.

private void btnStop_Click(object sender, RoutedEventArgs e)
{
  if (cts.IsCancellationRequested || po.CancellationToken.IsCancellationRequested)
  {
    cts.Cancel();
  }
}

ОБНОВЛЕНИЕ: Решение благодаря Damien_The_Unbeliever :

private void btnStop_Click(object sender, RoutedEventArgs e)
{
  cts.Cancel();
}

1 Ответ

2 голосов
/ 24 августа 2011

Вам нужно вызвать cts.Cancel () в обработчике событий для вашей кнопки остановки.Это сообщит вашему токену отмены, что вы запросили отмену.

...