C#の並列処理Parallel.For, ForEachで使えないcontinueを実現する

Webスクレイピング処理がとても長くなってきたため並列・並行処理を導入しました。

Webスクレイピングの結果を分析するときにcontinueやbreakでループを中断する必要があったのですが、Parallelクラスのループ中ではcontinueができないのです。

Stopメソッドが用意されていますがこれは並行処理されている他のスレッドもすべて止めてしまいます。いま処理しているスレッド分だけをもうそこで終わりにして、他のスレッドはそのまま実行してほしいときにはStopは使えません。

この解決方法は簡単であり、まずParallel.For,ForEachの中身をすべて別のメソッドに分離します。

privateメソッドを新たに作ってそこに全部押し込んでしまいましょう。

そして以下のようにParallelクラスのForメソッドやForEachメソッドで並列化をします。

Parallel.ForEach(concurrentDictionary, x=>

{

//ループの中身

Process();

});

ループの中身をすべてProcess()に移すわけです。

そしてProcess()メソッドの中で以下のようにします。

private void Process()

{

//continue;機能を持たせるためにはreturn;を使う

if (flag) return;

}

そしてそのメソッドの中でcontinue;のかわりにreturn;を使います。

そうすればreturn;で関数が終了し呼び出し元に処理が戻るので、そのループn回目のスレッドはそこで終了します。n-1やn+1など他のループ回には影響しません。つまり並列化しない通常ループのcontinueと同じ効果があります。他の並列処理ループは存続したままで、return;したループ回だけを途中で終わらせることができます。