.net loopstate.Break()、loopstate.Stop()和CancellationTokenSource.Cancel()之间的区别是什么

.net loopstate.Break()、loopstate.Stop()和CancellationTokenSource.Cancel()之间的区别是什么,.net,windows,c#-4.0,for-loop,parallel-processing,.net,Windows,C# 4.0,For Loop,Parallel Processing,我有一个简单的问题,我有以下简单的并行for循环。此for循环是windows服务的一部分。当有人停止服务时,我想停止循环。我可以找到三种方法来停止并行,这是在if条件下。停止并行for循环的最佳方法是什么?有什么区别 CancellationTokenSource cancellationToken = new CancellationTokenSource(); ParallelOptions options = new ParallelOptions();

我有一个简单的问题,我有以下简单的并行for循环。此for循环是windows服务的一部分。当有人停止服务时,我想停止循环。我可以找到三种方法来停止并行,这是在if条件下。停止并行for循环的最佳方法是什么?有什么区别

       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()
表示在当前线程上的当前迭代之前,在所有线程上完成所有迭代,然后退出循环()

loopState.Stop()
表示尽快停止所有迭代()


另一种终止执行的方法是call 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()

一些供参考的文章: