我有一个简单的问题,我有以下简单的并行for循环。 这for循环是Windows服务的一部分。 当有人停止服务时,我想停止循环。 我可以find三种方法来停止并行,这是如果条件。 什么是停止并行循环的最好方法,有什么区别?
CancellationTokenSource cancellationToken = new CancellationTokenSource(); ParallelOptions options = new ParallelOptions(); options.CancellationToken = cancellationToken.Token; Parallel.For(0, maximum_operations, options, (a, loopState) => { { //Do something if(!KeepProcessing) { //loopState.Break(); //loopState.Stop(); cancellationToken.Cancel(); } } });
CancellationToken
用于表示取消 。
loopState.Break()
和loopState.Stop()
用于结束执行 。
这是一个例子
Parallel.For(0, maximum_operations, options, (a, loopState) => { // do work // cancellationToken.Cancel() should be called externally if(token.IsCancellationRequested) { // cancellation requested - perform cleanup work if necessary // then call loopState.Break(); // or loopState.Stop(); } });
loopState.Break()
表示完成当前线程上当前迭代之前的所有线程上的所有迭代,然后退出循环( MSDN )。
loopState.Stop()
意味着尽快停止所有迭代( MSDN )。
另一种终止执行的方法是调用token.ThrowIfCancellationRequested(),但是您将需要处理OperationCanceledException
异常:
public void MyMethod() { try { Parallel.For(0, maximum_operations, options, (a, loopState) => { // do work token.ThrowIfCancellationRequested(); }); } catch (OperationCanceledException) { // handle cancellation } }
所有这些方法都是终止Parallel.For
执行的有效方法。 你使用哪一个取决于你的要求。
例如:
token.ThrowIfCancellationRequested()
loopState.Break()
或loopState.Stop()
一些文章供参考: