【问题标题】:nested Parallel.For Loop - Cancellation.Token doesn't work嵌套的 Parallel.For 循环 - Cancellation.Token 不起作用
【发布时间】:2011-11-02 20:51:38
【问题描述】:

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

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

在我的紧密循环中,我有一个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();
}

【问题讨论】:

  • 请使用标签而不是在您的主题行中添加“(C#)”之类的内容。
  • 对不起,我也把它加到我的标签里了

标签: c# wpf multithreading task cancellation


【解决方案1】:

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

【讨论】:

  • 谢谢 .. 我也忘了添加代码。看一看。我想我按照你的建议做了
  • @user774326 - btnStop_Click 方法中的条件意味着只有在已经请求取消的情况下才会调用 Cancel...
  • Yipee ...现在可以了,谢谢...还有一件事我该如何重新启动任务!?!这意味着如果用户再次单击开始,整个过程应该重新开始。是否有对错误类型的事物的重置取消令牌请求??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多