21

parallel.foreachをステップスルーする簡単な方法はありますか?ブレークポイントを使用してこれをデバッグするための最良の方法は何ですか?

4

7 に答える 7

38

デバッグ中は、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ウィンドウなど)を使用するか、スレッドの切り替え、ステップ中のスレッドのロックなど、マルチスレッドアプリケーションのデバッグにリストされているさまざまな手法を使用することで、はるかに簡単にデバッグできます。

于 2012-06-19T20:41:33.280 に答える
10

ここでの他の回答と同様に、デバッグ時に並列度を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()

于 2014-03-27T10:42:00.520 に答える
5

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:

enter image description here

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

enter image description here

于 2015-08-06T17:12:14.367 に答える
5

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
}
于 2018-09-13T09:40:18.773 に答える
0

デバッグモードで実行している場合は、一時的に非並列foreachとして書き直すか、プリプロセッサディレクティブを使用して非並列コードを実行します。

于 2012-06-19T20:38:58.817 に答える
0

ブレークポイントで[ヒット時]オプションを使用するのが好きです(ブレークポイントを右クリックし、[ヒット時...]を選択します。変数の値、現在のスレッドなどを含むメッセージをコンソールに出力できます。 。

于 2012-06-19T20:46:35.350 に答える
0

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

于 2015-08-06T16:51:24.393 に答える