[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]
このチュートリアルでは、並列タスクの と 並列スタック ウィンドウを使用して、並列アプリケーションをデバッグする方法を示します。
これらのウィンドウでは、理解し、タスクの並列ライブラリ API を使用するコードの実行時の動作を確認できます。
組み込みのブレークポイントを含むサンプル コードをここに示します。
コードが中断後ことを確認する並列タスクと並列スタック ウィンドウを使用する方法をチュートリアルに示します。
このチュートリアルでは、これらのタスクについて説明します。
-
1 つのビューですべてのスレッドのコール スタックを表示する方法。
-
System.Threading.Tasks.Task インスタンスは、アプリケーションで作成されますがの一覧を表示する方法。
-
スレッドの代わりにタスクの実際の呼び出しスタックを表示する方法。
-
並列タスクと並列スタック ウィンドウからコードに移動する方法。
-
方法、ウィンドウはグループ化、ズーム、 および [その他の関連機能のスケールに対処します。
Visual Studio 2010 Beta 2 のコンピューターにインストールされている必要があります。
このチュートリアルでは [マイ コードのみ その が有効な前提としています。
ツールの メニューの [オプションの をクリックして、デバッグ ノードを展開、 の [全般] を選択し、[有効にする [マイ コードのみ (マネージのみ) します。
この機能を設定しない場合このチュートリアルでは、引き続き使用できますが、結果の図は、得られない可能性があります。
C# のサンプル
C# サンプルを使用している場合このチュートリアルも想定しています外部コードは非表示します。
外部のコードが表示されてかどうかを切り替え、呼び出し履歴 ウィンドウの 名 テーブル ヘッダーを右クリックしオンまたは の [外部コードの表示] をオフにします。
この機能を設定しない場合このチュートリアルでは、引き続き使用できますが、結果の図は、得られない可能性があります。
C++ のサンプル
C++ のサンプルを使用している場合はここで外部のコードへの参照無視できます。
外部のコードだけ C# サンプルに適用されます。
図
このトピックの図は、C# のサンプルを実行するクワッド コア コンピューターで記録されます。
他の構成を使用してこのチュートリアルを完了することができますの図は、異なる場合がありますコンピューターに表示される内容。
このチュートリアルでサンプル コードは、何もするアプリケーションとしています。
目標は、ツール ウィンドウを使用して、並列アプリケーションをデバッグする方法を理解するだけです。
サンプル プロジェクトを作成するには
-
Visual Studio で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
-
にインストールされたテンプレートの ペインで、Visual C#、Visual Basic または Visual C++ を選択します。
マネージ言語では、その .NET Framework 4 Beta 1 フレームワーク] ボックスに表示されることを確認します。
-
のコンソール アプリケーションを選択し、[OK] の を実行します。
デバッグ構成の場合は、既定に残ります。
-
プロジェクトに .cpp や .cs、.vb のコード ファイルを開きます。
空のコード ファイルを作成するのには、その内容を削除します。
-
次のコードを選択した言語は、空のコード ファイルに貼り付けます。
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
class S
{
staticvoid Main()
{
pcount = Environment.ProcessorCount;
Console.WriteLine("Proc count = " + pcount);
ThreadPool.SetMinThreads(4, -1);
ThreadPool.SetMaxThreads(4, -1);
t1 = new Task(A, 1);
t2 = new Task(A, 2);
t3 = new Task(A, 3);
t4 = new Task(A, 4);
Console.WriteLine("Starting t1 " + t1.Id.ToString());
t1.Start();
Console.WriteLine("Starting t2 " + t2.Id.ToString());
t2.Start();
Console.WriteLine("Starting t3 " + t3.Id.ToString());
t3.Start();
Console.WriteLine("Starting t4 " + t4.Id.ToString());
t4.Start();
Console.ReadLine();
}
staticvoid A(object o)
{
B(o);
}
staticvoid B(object o)
{
C(o);
}
staticvoid C(object o)
{
int temp = (int)o;
Interlocked.Increment(ref aa);
while (aa < 4)
{
;
}
if (temp == 1)
{
// BP1 - all tasks in C
Debugger.Break();
waitFor1 = false;
}
else
{
while (waitFor1)
{
;
}
}
switch (temp)
{
case 1:
D(o);
break;
case 2:
F(o);
break;
case 3:
case 4:
I(o);
break;
default:
Debug.Assert(false, "fool");
break;
}
}
staticvoid D(object o)
{
E(o);
}
staticvoid E(object o)
{
// break here at the same time as H and Kwhile (bb < 2)
{
;
}
//BP2 - 1 in E, 2 in H, 3 in J, 4 in K
Debugger.Break();
Interlocked.Increment(ref bb);
//after
L(o);
}
staticvoid F(object o)
{
G(o);
}
staticvoid G(object o)
{
H(o);
}
staticvoid H(object o)
{
// break here at the same time as E and K
Interlocked.Increment(ref bb);
Monitor.Enter(mylock);
while (bb < 3)
{
;
}
Monitor.Exit(mylock);
Thread.SpinWait(1000);
//after
L(o);
}
staticvoid I(object o)
{
J(o);
}
staticvoid J(object o)
{
int temp2 = (int)o;
switch (temp2)
{
case 3:
t4.Wait();
break;
case 4:
K(o);
break;
default:
Debug.Assert(false, "fool2");
break;
}
}
staticvoid K(object o)
{
// break here at the same time as E and H
Interlocked.Increment(ref bb);
Monitor.Enter(mylock);
while (bb < 3)
{
;
}
Monitor.Exit(mylock);
Thread.SpinWait(1000);
//after
L(o);
}
staticvoid L(object oo)
{
int temp3 = (int)oo;
switch (temp3)
{
case 1:
M(oo);
break;
case 2:
N(oo);
break;
case 4:
O(oo);
break;
default:
Debug.Assert(false, "fool3");
break;
}
}
staticvoid M(object o)
{
// breaks here at the same time as N and Q
Interlocked.Increment(ref cc);
while (cc < 3)
{
;
}
//BP3 - 1 in M, 2 in N, 3 still in J, 4 in O, 5 in Q
Debugger.Break();
Interlocked.Increment(ref cc);
while (true)
Thread.Sleep(500); // for ever
}
staticvoid N(object o)
{
// breaks here at the same time as M and Q
Interlocked.Increment(ref cc);
while (cc < 4)
{
;
}
R(o);
}
staticvoid O(object o)
{
Task t5 = Task.Factory.StartNew(P, TaskCreationOptions.AttachedToParent);
t5.Wait();
R(o);
}
staticvoid P()
{
Console.WriteLine("t5 runs " + Task.CurrentId.ToString());
Q();
}
staticvoid Q()
{
// breaks here at the same time as N and M
Interlocked.Increment(ref cc);
while (cc < 4)
{
;
}
// task 5 dies here freeing task 4 (its parent)
Console.WriteLine("t5 dies " + Task.CurrentId.ToString());
waitFor5 = false;
}
staticvoid R(object o)
{
if ((int)o == 2)
{
//wait for task5 to diewhile (waitFor5) { ;}
Thread.SpinWait(900000);
int i;
//spin up all procsfor (i = 0; i < pcount - 4; i++)
{
Task t = Task.Factory.StartNew(() => { while (true);});
Console.WriteLine("Started task " + t.Id.ToString());
}
Task.Factory.StartNew(T, i + 1 + 5, TaskCreationOptions.AttachedToParent); //scheduled
Task.Factory.StartNew(T, i + 2 + 5, TaskCreationOptions.AttachedToParent); //scheduled
Task.Factory.StartNew(T, i + 3 + 5, TaskCreationOptions.AttachedToParent); //scheduled
Task.Factory.StartNew(T, i + 4 + 5, TaskCreationOptions.AttachedToParent); //scheduled
Task.Factory.StartNew(T, i + 5 + 5, TaskCreationOptions.AttachedToParent); //scheduled//BP4 - 1 in M, 2 in R, 3 in J, 4 in R, 5 died
Debugger.Break();
}
else
{
Debug.Assert((int)o == 4);
t3.Wait();
}
}
staticvoid T(object o)
{
Console.WriteLine("Scheduled run " + Task.CurrentId.ToString());
}
static Task t1, t2, t3, t4;
staticint aa = 0;
staticint bb = 0;
staticint cc = 0;
staticbool waitFor1 = true;
staticbool waitFor5 = true;
staticint pcount;
static S mylock = new S();
}
-
[ファイル] メニューの [すべてを保存] をクリックします。
-
[ビルド] メニューの [ソリューションのリビルド] をクリックします。
されている Debugger.Break への 4 つの呼び出しがあることがわかります。
したがって、する; のブレークポイントを挿入する必要はありません。だけでアプリケーションを実行、4 回までに、デバッガーで中断するのになります。
並列スタック ウィンドウを使用します。スレッド ビュー
[デバッグ] メニューの [デバッグ開始] をクリックします。
最初のブレークポイント ヒットするまで待ちます。
1 つのスレッドのコール スタックを表示するには
-
[デバッグ] メニューの [ウィンドウ] をポイントし、[スレッド] をクリックします。
Visual Studio の下部にある スレッド ウィンドウをドッキングします。
-
[デバッグ] メニューの [ウィンドウ] をポイントし、[呼び出し履歴] をクリックします。
Visual Studio の下部にある 呼び出し履歴の ウィンドウをドッキングします。
-
スレッド ウィンドウに現在のスレッドをダブルクリックします。
現在のスレッドは、黄色の矢印があります。
現在のスレッドを変更すると、コール スタックが呼び出し履歴 ウィンドウに表示されます。
並列スタック ウィンドウを確認するには
-
で メニューの [デバッグ、Windows をポイントし、[並列スタック をクリックします。
その スレッド が選択されている、左上隅にあるボックス確認します。
並列スタック ウィンドウで複数のコール スタックを 1 つのビューで同時に表示できます。
The following illustration shows the Parallel Stacks window above the Call Stack window.
メイン スレッドのコール スタックが 1 つのボックスに表示され、その他の 4 つのスレッドのコール スタックは別のボックスでグループ化されます。
4 つのスレッド化された、スタック フレームの同じメソッド コンテキスト、共有するためつまり、同じ方法ではです。A、B、および C。
スレッド ID とを 1 つのボックスを共有するスレッドの名前を表示するには、ヘッダー (4 スレッド) をマウスです。
現在のスレッドが表示されるで太字、次の図は、のようにします。
黄色の矢印は、現在のスレッドのアクティブなスタック フレームを示します。
その上に置きます詳細情報を取得、
呼び出し履歴ウィンドウで右クリックして ( のモジュール名、パラメーターの型の パラメーター名の パラメーター値の 、行番号の およびバイト オフセット ) のスタック フレームの表示の詳細度を設定できます。
青のハイライト、ボックスの周囲に指定、現在のスレッドがそのボックスの一部。
現在のスレッドは"、ツール ヒントに太字のスタック フレームによっても示されます。
[スレッド] ウィンドウで、メイン スレッドをダブルクリックした場合は並列スタック ウィンドウで青のハイライトが適切に移動するを確認できます。
2 番目のブレークポイントまで実行を再開するには
-
2 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
次の図の 2 番目のブレークポイント、スレッド ツリーに示します。
最初のブレークポイント、4 つのスレッドをすべてしました S.A から S.B を S.C メソッド。
その情報は 並列スタック ウィンドウで表示されたままですが、4 つのスレッドはさらに進行しています。
S.D および東南続きの 1 つ
S.F、S.G、S.H. 続き別
外部コードの非ユーザーに続き、S.K に倒産 S.I を S.J、してそれらが 1 つからの続きする 2 つの他.
スレッドのスレッドの ID を表示するボックス ヘッダー、たとえば、スレッドの 1 または 2 スレッド、上に置くことができます。
スレッド ID とその他のフレームの詳細を表示するスタック フレーム上に置くことができます。
青のハイライトは、現在のスレッドを示し、黄色の矢印を現在のスレッドのアクティブなスタック フレームを示します。
布スレッド アイコン (重なり合う線青と赤い waved 線) は、固定のスレッドのアクティブなスタック フレームを示します。
呼び出し履歴 ウィンドウでフレームを切り替える S.B をダブルクリックします。
並列スタック ウィンドウを緑の曲線矢印アイコンを使用して、現在のスレッドの現在のスタック フレームを示します。
スレッド ウィンドウでスレッドを切り替えるにはし、 並列スタック ウィンドウのビューが更新されることを確認します。
別のスレッド、または、別のスレッドの別のフレームを切り替えるショートカット メニューを並列スタック ウィンドウでを使用することができます。
たとえば、S.J をマウスの右ボタンでクリックして、 をテキスト枠に切り替え、] コマンドをクリックします。
S.C をマウスの右ボタンでクリックし、テキスト枠に切り替え をポイントします。
コマンドの 1 つは、現在のスレッドのスタック フレームを示すチェック マークがあります。
切り替えたり (緑色の矢印だけが移動する) 同じスレッドのフレームにしたりできます (青のハイライトは移動も)、他のスレッドを切り替えるには。
次に、サブメニューを示します。
メソッドのコンテキストを 1 つのスタック フレームに関連付けられた場合、ボックス ヘッダーは 1 スレッド を表示し、切り替えることをダブルクリックするとします。、
場合は、メソッドのコンテキストに関連付けられている 1 つ以上のフレームを含む] をダブルクリックし、メニューの [自動的に表示されます。
上、メソッドのコンテキストに置くと右にある黒い三角形を確認します。
ショートカット メニューを表示もその三角形をクリックします。
多くのスレッドを持つ大規模なアプリケーション、スレッドのサブセットだけに集中する可能性があります。
並列スタック ウィンドウのみのフラグが設定されたスレッドのコール スタック表示できます。
ツールバーの を表示するフラグ付きのみ 横にあるクリックして、リスト ボックス。
次に、スレッド ウィンドウで 1 つずつ並列スタック ウィンドウでのコール スタックの表示方法確認するスレッドをフラグです。
スレッド フラグを設定するには、ショートカット メニューの [またはスレッドの最初のセルを使用します。
クリックして を表示するフラグ付きのみ ツールバーの (には、もう一度すべてのスレッドを表示します。
3 番目、ブレークポイントまで実行を再開するには
-
3 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
複数のスレッドが同じメソッドにはメソッドが、コール スタックの先頭にない、別のボックスに、メソッド表示されます。
現在ブレークポイントで例は S.L、3 つのスレッドにされ、3 つのボックスに表示されます。
S.L. をダブルクリックします。
S.L が、他の 2 つのボックス内に太字見えますの他の場所を参照することができるようにことを確認します。
S.L にフレームを呼び出すかと呼び出しをフレームを表示する場合は、ツールバーには、方法ビューの表示/非表示 ボタンをクリックします。
次に、並列スタック ウィンドウのメソッドのビューを示します。
図は、選択メソッドでピボットおよび、ビューの途中で、独自のボックスに、配置方法を確認します。
呼び出し元と callees、上部と下部に表示します。
このモードを終了に 表示/非表示方法ビュー) をクリックします。
並列スタック ウィンドウのショートカット メニューの [が次の他の項目。
-
16 進表示 10 進数と 16 進数の間のツールヒントの数値を切り替えます。
-
シンボルの読み込み情報 および設定の記号と特殊文字の は、それぞれのダイアログ ボックスを開きます。
-
ソース コードへ移動 と逆の は、選択したメソッドに、エディターに移動します。
-
ユーザー コードでない場合でも、外部コードの には、すべてのフレームが表示されますが表示されます。
それらの記号があるないためには淡色表示) を追加、フレームに合わせてに展開、ダイアグラムを表示するにやってみましょう。
大規模なダイアグラムがあり、次のブレークポイントにステップ、; 現在のスレッドのアクティブなスタック フレームに自動スクロールを表示する可能性があります。最初のブレークポイントをヒットしているスレッドは。
並列スタック ウィンドウで、 自動スクロール、ツールバーの [現在のスタック フレーム が上かを確認します。
-
並列スタック ウィンドウで、続行する前に、左と下方向にずっとのすべての方法をスクロールします。
4 番目のブレークポイントまで実行を再開するには
-
4 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
通知方法、ビュー autoscrolled にします。
スレッド ウィンドウ内のスレッドを切り替えたりする方法に注意してください 呼び出し履歴 ウィンドウでのスタック フレームを切り替える、ビューの正しいフレームに autoscrolls 常にします。
自動スクロール オプションのツールの現在のフレームの電源を切りの差異を表示します。
オーバーヘッドのビューは、並列スタック ウィンドウで大きなダイアグラムとも役立ちます。
表示できます、オーバーヘッド、ウィンドウの左下隅にスクロール バーの間] をクリックして、次の図のようにします。
すばやく、図の周りをパンする四角形を移動できます。
任意の方向に、ダイアグラムを移動する別の方法は、ダイアグラムの空白の領域をクリックして目的の場所までドラッグです。
図との間で、ながら Ctrl キーを押しながらマウス ホイールを移動します。
または、ツールバーの [拡大/縮小] をクリックし、ズーム ツールを使用しています。
表示、スタック、ボトムアップではなく上から下方向に ツールの メニューのをクリックして オプションをクリックし選択またはできますデバッグ ノードの下オプションをオフにします。
-
続行する前に、でデバッグ メニューの [、 デバッグの停止 実行を終了するをクリックします。
[並列タスク] ウィンドウと並列スタック ウィンドウの [タスク ビューを使用してください。
続行する前に、以前の手順を完了することおくをお勧めします。
最初のブレークポイントまで、アプリケーションを再起動するには、がヒットします。
-
で メニューの [デバッグ のデバッグの開始をクリックして、最初のブレークポイント ヒットするまで待機します。
-
[デバッグ] メニューの [ウィンドウ] をポイントし、[スレッド] をクリックします。
Visual Studio の下部にある スレッド ウィンドウをドッキングします。
-
で メニューの [デバッグ、Windows をポイントし、[呼び出し履歴 をクリックします。
Visual Studio の下部にある 呼び出し履歴の ウィンドウをドッキングします。
-
ウィンドウように現在のスレッドのスレッドをダブルクリックします。
現在のスレッドは、黄色の矢印があります。
現在のスレッドを変更すると、他のウィンドウが更新されます。
次に、タスクは検討します。
-
で メニューの [デバッグ、Windows をポイントし、[タスクの並列 をクリックします。
次の図の並列タスク ウィンドウです。
各実行中のタスクをその ID は、同じ厳密プロパティ、ID および、(重ねるを表示、全体のコール スタックを含むツールヒント) の位置を実行するスレッドの名前によって返される読み取りできます。
また、タスク 列表示できます; タスクに渡されたするメソッドつまり、開始点。
任意の列を並べ替えることができます。
並べ替え列および方向を示す、並べ替えグリフを確認します。
左または右にドラッグして、列も並べ替えることができます。
黄色の矢印は、現在のタスクを示します。
タスクをダブルクリックしてかショートカット メニューを使用して、、タスクを切り替えることができます。
タスク、切り替えるし、基になるスレッドが現在、他のウィンドウが更新されます。
手動で 1 つのタスクからに切り替える別、黄色の矢印を移動しますが、白の矢印、デバッガーを中断する原因となったタスクを引き続き表示されます。
2 番目のブレークポイントまで実行を再開するには
-
2 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
以前は、状態] 列として実行中、すべてのタスクを表示するが 2 つのタスクの待機ようになりました。
タスクは、多くの異なる理由ブロックできます。
状態 列でがブロックされる理由を説明する待機タスクをマウスです。
待機してたとえば、次の図でタスク 3 がいますタスク 4。
待機して作業 4 はいます 2 のタスクに割り当てられたスレッドが所有するモニター。
並列タスク ウィンドウの最初の列で、フラグをクリックして、タスク フラグを設定することができます。
フラグを同じデバッグ セッションで別のブレークポイントの間でタスクを追跡したりのコール スタックは 並列スタック ウィンドウに表示するタスクのフィルターを使用できます。
並列スタック ウィンドウを以前使用した場合、アプリケーション スレッドを表示します。
並列スタック ウィンドウのビューが、今度のアプリケーション タスクを表示します。
このためにはタスクの でを選択、上段左側のボックス。
次に、タスク ビューを示します。
現在のタスクが実行されないスレッドは、並列スタック ウィンドウのタスク ビューで表示されません。
またのタスクを実行するスレッドを上部と、スタックの一番下からフィルター タスクに関係ないされるスタック フレームの一部は。
並列タスク ウィンドウをもう一度表示します。
列に対するショートカット メニューを表示する列見出しは任意を右クリックします。
列を追加または削除するには、ショートカット メニューの [を使えます。
たとえば、AppDomain 列は選択できません;したがって、一覧には表示されません。
の親をクリックします。
親 列は、4 つのタスクの値を含まない表示されます。
3 番目、ブレークポイントまで実行を再開するには
-
3 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
タスク 5、新しいタスクが実行今すぐされタスク 4 は現在待機しています。
状態 ウィンドウで待機している仕事を重ねるして理由を表示できます。
親 列でそのタスク 4 は作業 5 の親になってを確認します。
親子関係を視覚化より、親 列見出しを右クリックし、 の親の子ビュー。
次の図が表示されます。
タスク 4 および 5 のタスクが同じスレッドで実行されていることを確認します。
この情報は、スレッド; ウィンドウでは表示されません。並列タスク ウィンドウの別の利点は、ここで表示です。
これを確認するには、並列スタック ウィンドウを表示します。
タスクの を表示していることを確認します。
並列タスク ウィンドウでダブルクリックすることによりタスク 4 および 5 を見つけます。
行うと、青のハイライト並列スタック ウィンドウで更新されます。
タスク 4 および 5 は並列スタック ウィンドウで、ツールヒントをスキャンしても検索できます。
並列スタック ウィンドウで、S.P を右クリックし、移動スレッド 。
対応するフレームがビューでは、ウィンドウ スレッド ビューに切り替えします。
同じスレッドで両方のタスクを確認できます。
これはスレッド ウィンドウと比べて、 並列スタック ウィンドウでのタスク ビューの別の利点です。
4 番目のブレークポイントまで実行を再開するには
-
3 番目のブレークポイントにヒットするまで実行を再開、でデバッグ メニューの継続 をクリックします。
の ID の 列ヘッダーをクリックして ID です。 を並べ替える
次の図が表示されます。
タスク 5 が完了すると、ためにが表示されなく。
コンピューターにそうでないこと、デッドロックが表示されていない場合は 1 回 F11 キーを押すとステップします。
タスク 3 とタスク 4 は、互いに待機しているようになりましたはデッドロックが発生します。
また、タスク 2 の子およびを今すぐスケジュールされる 5 つの新しいタスクもあります。
スケジュールされたタスクは、コード内で開始されたがまだ実行されていないタスクです。
したがって、その場所の と スレッドの割り当て 列は空です。
並列スタック ウィンドウをもう一度表示します。
各ボックスのヘッダーには、スレッド ID と名前を示すツールヒントがあります。
並列スタック ウィンドウでのタスク ビューに切り替えます。
次の図は、のように、タスク ID と、名前と、タスクの状態を表示するヘッダーをマウスです。
列でタスクをグループ化できます。
並列タスク ウィンドウに、 状態 列見出しを右クリックし、 グループ ステータス で。
次の図の状態別にグループ化、並列タスク ウィンドウです。
その他の列でグループすることもできます。
タスクのグループ化、によってタスクのサブセットに集中できます。
各折りたたみ可能なグループには、グループ化された項目の数がします。
折りたたみ ボタンの右側に フラグ をクリックして、グループ内のすべての項目をすばやくもフラグことができます。
調べるには、並列タスク ウィンドウの最後の機能は、タスクを右クリックと表示されるショートカット メニューです。
ショートカット メニューは、タスクの状態に応じて、異なるコマンドが表示されます。
コピーの 、[すべて選択] を 16 進数表示スイッチ タスク、枠の固定割り当てられたスレッド 、枠の固定すべてのスレッドがこの 、および 割り当てられたスレッドを解放、およびフラグの 場合、コマンドがあります。
タスク、または、タスクの基になるスレッドを保持することができますか、割り当てられた 1 つを除くすべてのスレッドを保持することができます。
固定されたスレッドが ウィンドウのタスクの並列でスレッド ウィンドウの ではアイコンで表示青 一時停止。
このチュートリアルでは、並列タスクの 並列スタック デバッガー ウィンドウを示します。
マルチスレッド コードを使用する実際のプロジェクトでのこれらのウィンドウを使用します。
C++、C# の場合、または Visual Basic で記述された並列のコードを調べてできます。
処理手順