嵌套Parallel.For循环 - Cancellation.Token不起作用

时间:2011-08-24 14:18:40

标签: c# wpf multithreading task cancellation

我有以下问题:我有一个紧密循环(故意),它在我的WPF应用程序的MainWindow.cs中的click事件开始。

现在,由另一个按钮触发的停止事件应该停止紧密循环并结束任务。

在我的紧凑循环中,我有一个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 个答案:

答案 0 :(得分:2)

您需要在停止按钮的事件处理程序中调用 cts.Cancel()。这将告知您的取消令牌您已请求取消。