2012-01-11 11 views
11

Ho una semplice domanda, ho seguito il semplice ciclo parallelo. questo ciclo for è parte del servizio Windows. Voglio interrompere il ciclo, quando qualcuno interrompe il servizio. Riesco a trovare tre modi per interrompere il parallelismo, che è in condizione se. Qual è il modo migliore per fermare il loop parallelo e quali sono le differenze?Qual è la differenza tra loopstate.Break(), loopState.Stop() e 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(); 

       } 
      } 
     }); 

risposta

15

CancellationToken è usato per cancellazione segnale.

loopState.Break() e loopState.Stop() vengono utilizzati per esecuzione finale.

Ecco un esempio

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() significa completa tutte le iterazioni su tutte le discussioni precedenti a l'iterazione corrente sul thread corrente e quindi chiudere l'anello (MSDN).

loopState.Stop() significa interrompere tutte le iterazioni non appena possibile (MSDN).


Un altro modo per terminare l'esecuzione è chiamare token.ThrowIfCancellationRequested(), ma è necessario per gestire l'eccezione OperationCanceledException:

public void MyMethod() 
{ 
    try 
    { 
     Parallel.For(0, maximum_operations, options, (a, loopState) => 
     { 
      // do work 

      token.ThrowIfCancellationRequested(); 
     }); 
    } 
    catch (OperationCanceledException) 
    { 
     // handle cancellation 
    } 
} 

Tutti questi metodi sono modi validi per terminare l'esecuzione dei Parallel.For. Quale usi dipende dalle tue esigenze.

Ad esempio:

  • E 'essenziale immediatamente fermata tutta l'esecuzione quando il servizio di Windows viene arrestato? Quindi è possibile utilizzare token.ThrowIfCancellationRequested()
  • Il loop si occupa di oggetti IDisposable che devono essere puliti? Allora si potrebbe utilizzare loopState.Break() o loopState.Stop()

Alcuni articoli di riferimento:

Problemi correlati