【问题标题】:parallel.invoke cancellation tokenparallel.invoke 取消令牌
【发布时间】:2011-06-21 20:57:11
【问题描述】:

当使用 Parallel.Invoke 时,您可以传入包含 cancelationToken 的 ParallelOptions。是否可以在调用中使用该令牌来确定是否应该退出?是否应该在操作中使用对 CancellationTokenSource 的引用?

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

Parallel.Invoke(po,
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 1"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 2"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 3"); cts.Cancel(); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 4"); }),
        new Action(() => { if (cts.IsCancellationRequested) return; Console.WriteLine("Invoked Method 5"); })
    );

更新:取消太晚了。我是在调用的方法之外做的。

注意:如果取消发生得很快,Parallel.Invoke 将抛出,否则 inoked 方法将退出而不会失败。

【问题讨论】:

    标签: .net-4.0 parallel-processing task-parallel-library cancellation-token


    【解决方案1】:

    是的。例如:

    CancellationToken ct = tokenSource.Token;
    
    ParallelOptions po = new ParallelOptions { CancellationToken = ct; };
    
    Parallel.Invoke(po
        () => { Console.WriteLine(ct.IsCancellationRequested); },
        // etc
    );
    

    特别是,您可以将取消令牌传递给其他可能将其传播到异步任务的方法。

    【讨论】:

    • 约翰,我正在这样做(尽管我发布的示例没有显示)但所有方法都会继续执行直到完成。
    • @DustinDavis:您需要展示您实际检查取消的方式。一个完整的例子——连同发生的事情——会更容易诊断问题。
    • 我想通了。取消太晚了。
    【解决方案2】:

    msdn 上有一个相当不错的例子。

    看来您既可以查询状态,也可以使用 cancelToken 向调度程序发出信号。

    http://msdn.microsoft.com/en-us/library/dd997364.aspx

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多