2012-01-11 3 views
11

私は簡単な質問があります。このforループはWindowsサービスの一部です。誰かがサービスを停止すると、私はループを止めたい。私は3つの方法を見つけることができます。パラレル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の実行を終了するための有効な方法です。どちらを使用するかは、要件によって異なります。例えば

:あなたのWindowsサービスが停止しているとき

  • はそれがすぐ停止すべての実行に不可欠ですか?次に使用することができますtoken.ThrowIfCancellationRequested()
  • ループは、クリーンアップが必要なIDisposableオブジェクトを処理しますか?そして、あなたは参照用loopState.Break()またはloopState.Stop()

いくつかの記事を使用することができます。

関連する問題