首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套Parallel.For循环- Cancellation.Token不工作

嵌套Parallel.For循环- Cancellation.Token不工作
EN

Stack Overflow用户
提问于 2011-08-24 14:18:40
回答 1查看 788关注 0票数 0

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

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

在我的紧循环中,我有一个Parallel.For loop.The的想法,就是我必须同时做一定数量的事情(Parallel.For),并且一次又一次地做这个(紧循环)。我不知道这是否是最好的方法,但这是我仅有的一种方法,不过它是有效的:)。

我对Cancellation.Token有一个问题,它似乎什么也不做。如何停止循环并正确结束任务。

这是我的密码:

代码语言:javascript
复制
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试过了,但没有停下来。

代码语言:javascript
复制
private void btnStop_Click(object sender, RoutedEventArgs e)
{
  if (cts.IsCancellationRequested || po.CancellationToken.IsCancellationRequested)
  {
    cts.Cancel();
  }
}

更新:多亏了Damien_The_Unbeliever

代码语言:javascript
复制
private void btnStop_Click(object sender, RoutedEventArgs e)
{
  cts.Cancel();
}
EN

回答 1

Stack Overflow用户

发布于 2011-08-24 14:26:24

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7176998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档