loopState.Break(),loopState.Stop()和CancellationTokenSource.Cancel()之间有什么区别?

我有一个简单的问题,我有以下简单的并行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执行的有效方法。 你使用哪一个取决于你的要求。

例如:

  • 当您的Windows服务停止时立即停止所有执行是必不可少的? 那么你可以使用token.ThrowIfCancellationRequested()
  • 您的循环是否处理需要清理的IDisposable对象? 那么你可以使用loopState.Break()loopState.Stop()

一些文章供参考:

  • MSDN:取消
  • MSDN:如何:停止或从一个Parallel.For循环中断