【问题标题】:What is difference between loopstate.Break(), loopState.Stop() and CancellationTokenSource.Cancel()loopstate.Break()、loopState.Stop() 和 CancellationTokenSource.Cancel() 有什么区别
【发布时间】:2012-02-07 17:54:03
【问题描述】:

我有一个简单的问题,我有以下简单的并行 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();

                }
            }
        });

【问题讨论】:

    标签: .net windows c#-4.0 for-loop parallel-processing


    【解决方案1】:

    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()

    一些文章供参考:

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      • 2015-03-26
      • 2013-08-19
      相关资源
      最近更新 更多