parallel.invoke取消令牌

3
在使用 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会抛出异常,否则被调用的方法将无法正常退出。
2个回答

4
是的。例如:
CancellationToken ct = tokenSource.Token;

ParallelOptions po = new ParallelOptions { CancellationToken = ct; };

Parallel.Invoke(po
    () => { Console.WriteLine(ct.IsCancellationRequested); },
    // etc
);

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

约翰,我正在做这件事(尽管我的示例代码中没有显示),但所有的方法都会继续执行直到完成。 - Dustin Davis
@DustinDavis:你需要展示你是如何实际检查取消的。提供一个完整的示例以及发生的情况,将有助于更容易地诊断问题。 - Jon Skeet
我弄清楚了。取消操作发生得太晚了。 - Dustin Davis

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接