6

Cancellation 操作と loopState 操作 (Break/Stop) の違いは何ですか?

private static CancellationTokenSource cts;
public static loopingMethod()
{
cts = new CancellationTokenSource();
try
{
    ParallelOptions pOptions = new ParallelOptions();
    pOptions.MaxDegreeOfParallelism = 4;
    pOptions.CancellationToken = cts.Token;
    Parallel.ForEach(dictObj, pOptions, (KVP, loopState) =>
    {
        pOptions.CancellationToken.ThrowIfCancellationRequested();
        parallelDoWork(KVP.Key, KVP.Value, loopState);
     }); //End of Parallel.ForEach loop
 }
 catch (OperationCanceledException e)
 {
 //Catestrophic Failure
 return -99;
 }
}

public static void parallelDoWork(string Id, string Value, ParallelLoopState loopState)
{
   try{
      throw new exception("kill loop");
   }
   catch(exception ex)
   {
       if(ex.message == "kill loop")
       {
           cts.Cancel();
           //Or do I use loopState here?
       }
   }
}

ParallelOptions Cancellation 操作と ParallelOptions 操作を使用する理由、またはその逆を使用する必要があるのはなぜloopState.Break();ですかloopState.Stop();?

4

2 に答える 2

2

ParallelLoopState.Break/Stopループの実行に固有のセマンティクスが明確に定義されている。つまり、これらを使用することで、ループをどのように終了させたいかを非常に具体的にすることができます。CancellationToken一方、Aは TPL の一般的な停止メカニズムであるため、並列ループに対して特別なことは何もしません。トークンを使用する利点は、他の TPL 機能間でトークンを共有できることです。そのため、同じトークンによって制御されるタスクとループを持つことができます。

于 2013-04-17T15:21:08.303 に答える
2

この記事を見る

「キャンセル トークンを設定すると、Invoke を中止できます (デリゲートが例外をスローすると、例外は飲み込まれ、他のすべてのデリゲートが実行された後にのみ Invoke によって再スローされることに注意してください)。」

シナリオ 1.元 [ガール|ボーイ] フレンド全員にメッセージを送信しようとしているユーザーがいるとします。彼らは [送信] をクリックしてから、本心に戻ってキャンセルしたいと考えています。キャンセル トークンを使用することで、メッセージの送信を停止できます。そのため、キャンセルが許可されている長時間実行されるプロセスがある場合は、キャンセル トークンを使用します。

シナリオ 2一方、プロセスを中断させたくない場合は、通常のループ状態の例外を使用して、すべてのスレッドが終了するまで例外が飲み込まれるようにします。

シナリオ 3 I/O 集中型のプロセスがある場合、parallel.foreach ではなく async/await を使用することをお勧めします。Microsoft のタスクベースの非同期パターンを確認してください。

于 2013-04-16T22:40:40.943 に答える