2012-01-11 34 views
11

有什麼區別我有一個簡單的問題,我有以下簡單的並行for循環。這個for循環是windows服務的一部分。當有人停止服務時,我想停止循環。我可以找到三種方法來停止並行,這是如果條件。停止並行for循環的最佳方法是什麼?有什麼區別?loopState.Break(),loopState.Stop()和CancellationTokenSource.Cancel()

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

       } 
      } 
     }); 

回答

15

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()
  • 你的循環是否處理需要清理的IDisposable對象?然後,你可以使用loopState.Break()loopState.Stop()

有些文章供參考: