2016-09-29 37 views
2

私はパラレルforeachループを開始するには、このコードを持っている:Parallel.ForEachループを停止する方法は?

Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, item => { 
    if (CallToStop == true) 
     { 
      //Code here to stop the loop! 
     }   
    internalProcessStart(item); 
}); 

私はスレッドを停止するための呼び出しがあるかどうかを確認しますいくつかのコードを持っているが、その後、私は、コードをbreak;したいと思いますが、このdoesnのパラレルで作業する。

私は同じquestion by someone elseを見つけましたが、そのコードは私のものとはまったく異なり、ParallelLoopState stateをどこに入れるのかわかりません。

ありがとうございます!

+0

ForEachループ本体でも編集できますか? –

+0

@KevinLe OK、完了! – user2924019

答えて

3

書き換え。

+0

ありがとう、これは私が使用したコードであり、うまく動作しています。お返事ありがとうございました。 – user2924019

+1

あなたが歓迎してくれてうれしいです。 – RajN

1

私はこのoverloadを使用して動作するはずだと思う:

Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (item , state) => 
    { 
     if (/*Stop condition here*/) 
     { 
      state.Break(); 
     }   
     internalProcessStart(item); 
    }); 
0

はこのexample (MSDN)のようにCancellationTokenを使用してみてください。 )

CancellationTokenSourceのCTS =新しいCancellationTokenSource(;:

このような何かを試してみてください

 // Use ParallelOptions instance to store the CancellationToken 
     ParallelOptions po = new ParallelOptions(); 
     po.CancellationToken = cts.Token; 
     po.MaxDegreeOfParallelism = Environment.ProcessorCount; 

     try 
     { 
      Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), po, item => { 
       // po.CancellationToken.ThrowIfCancellationRequested(); //1 
       if (CallToStop == true) 
       { 
        //Code here to stop the loop! 
        cts.Cancel(); 
       } 
       if (po.CancellationToken.IsCancellationRequested == false) 
       {   
        internalProcessStart(item); 
       } 
      }); 
     } 
     catch (OperationCanceledException e) 
     { 
      // handle 
     } 
     finally 
     { 
      cts.Dispose(); 
     } 

またはその代わりに、直接CallToStop = trueコールcts.Cancel()を設定します。

// 1を終了し、終了していないすべてのスレッドをスローしますOperationCanceledExceptionCallToStop = trueがエラーのためにすべての並列スレッドを停止している場合のみ使用します)。

cts.TokeninternalProcessStart(item,token)に渡して、内部プロセスが既に実行されているときに取り消すとどうするかを処理することもできます。

Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, (item, state) => { 
    if (CallToStop == true) 
     { 
      state.Break(); 
     }   
    internalProcessStart(item); 
}); 

・ホープ、このことができます以下のように

0

このようなものを試してみてください。概念的には、ループステートをラムダ関数に渡す必要があります。

Parallel.ForEach<int>(new List<int>(), 
      new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, 
      (val, loopState) => 
      { 
       if (val == 9) //enter your stopcondition here 
       { 
        loopState.Stop(); 
        return; 
       } 
      }); 
関連する問題