parallel.foreachをステップスルーする簡単な方法はありますか?ブレークポイントを使用してこれをデバッグするための最良の方法は何ですか?
7 に答える
デバッグ中は、1に設定Parallel.ForEach
して実行するように設定することがよくありますMaxDegreeOfParallelism
。これにより、デバッグがはるかに簡単になります。
const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item =>
{ //...
ただし、これは競合状態やデータ同期に関連する問題のデバッグには役立ちません。実際、コード内の実際の問題を隠したり排除したりすることがよくあります。
これらの問題は、VS 2010の新しいツール( Parallel Tasksウィンドウなど)を使用するか、スレッドの切り替え、ステップ中のスレッドのロックなど、マルチスレッドアプリケーションのデバッグにリストされているさまざまな手法を使用することで、はるかに簡単にデバッグできます。
ここでの他の回答と同様に、デバッグ時に並列度を1に設定しますが、これは次のような拡張メソッドを使用して行います。
public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
var pQuery = source.AsParallel();
#if DEBUG
pQuery = pQuery.WithDegreeOfParallelism(1);
#endif
return pQuery;
}
次に、使用する代わりに使用.AsParallel()
します.AsDebugFriendlyParallel()
You can actually get similar results with Visual Studio just by freezing all the threads except one, select all threads but one in the Threads windows and right click -> Freeze like this:
Also, if you want to reproduce a race condition and stopping on breakpoints breaks it, you can always add tracepoints - either with visual studio or with plugins that help with it, such as Oz Code
As @PaulG answered i think best practice is just set MaxDegreeOfParallelism
value to 1
. Then normally Parallel
also will work similar to regular loop like For
, Foreach
. This is the faster way to debug on Parallel
. So you don't need to switch code between regular loop and Parallel
.
Parallel.For(0, itemsList.Count, new ParallelOptions { MaxDegreeOfParallelism = 1 }, i =>
{
//your process goes here
}
デバッグモードで実行している場合は、一時的に非並列foreachとして書き直すか、プリプロセッサディレクティブを使用して非並列コードを実行します。
ブレークポイントで[ヒット時]オプションを使用するのが好きです(ブレークポイントを右クリックし、[ヒット時...]を選択します。変数の値、現在のスレッドなどを含むメッセージをコンソールに出力できます。 。
OzCode will help you a lot, it has a feature like tracepoints on steroids that is super useful when debuging concurrent\parallel code https://www.youtube.com/watch?v=_vuMi-3jGwY