ウィンドウの使用

更新 : 2011 年 3 月

[並列タスク] ウィンドウは [スレッド] ウィンドウに似ていますが、このウィンドウには、各スレッドではなくそれぞれの System.Threading.Tasks.Task または task_handle オブジェクトに関する情報が表示されます。 スレッドと同様、タスクは、同時に実行できる非同期操作を表します。ただし、複数のタスクが同じスレッドで実行される場合もあります。

マネージ コードでは、System.Threading.Tasks.Task オブジェクトを操作するときに [並列タスク] ウィンドウを使用できます。 マネージ コードのタスクの詳細については、「.NET Framework の並列プログラミング」を参照してください。

ネイティブ コードでは、タスク グループ並列アルゴリズム非同期エージェント、および軽量タスクを操作するときに [並列タスク] ウィンドウを使用できます。 ネイティブ コードのタスクの詳細については、「同時実行ランタイム」を参照してください。

[並列タスク] ウィンドウは、デバッガーを中断するといつでも使用できます。 アクセスするには、[デバッグ] メニューの [ウィンドウ] をクリックし、[並列タスク] をクリックします。 次の図は、既定のモードの [並列タスク] ウィンドウを示しています。

並列タスク ウィンドウ

注意

マネージ コードでは、状態が CreatedWaitingForActivation、または WaitingToRunTask は、それが作成またはスケジュールされたスレッドがスリープ状態または結合状態の場合に [並列タスク] ウィンドウに表示されないことがあります。

[並列タスク] の列の情報

[並列タスク] ウィンドウの列には、次の情報が表示されます。

列名

説明

フラグ

どのタスクにフラグが設定されているかを示します。タスクのフラグを設定または解除することができます。

アイコン

黄色の矢印は現在のタスクを示します。 現在のタスクは、現在のスレッドの最上位のタスクです。

白い矢印は中断しているタスク、つまりデバッガーを呼び出したときに現在のタスクだったタスクを示します。

一時停止アイコンはユーザーによって凍結されているタスクを示します。 一覧でタスクを右クリックして、タスクを凍結したり凍結解除したりすることができます。

ID

タスクに対してシステムで指定された番号です。 ネイティブ コードでは、タスクのアドレスになります。

状態

タスクの現在の状態 (スケジュール、実行中、デッドロック、または待機中) です。 スケジュール状態のタスクは、まだ実行されていないため、まだ呼び出し履歴、割り当てられたスレッド、関連情報がないタスクです。

実行中のタスクは、デバッガーを中断する前にコードを実行していたタスクです。

待機中のタスクは、イベントがシグナル状態になるか、ロックが解放されるか、別のタスクが終了するのを待機しているためにブロックされているタスクです。

デッドロック状態のタスクは、スレッドが別のスレッドでデッドロックされた待機中のタスクです。

ブロックに関する詳細情報を表示するには、デッドロック状態または待機中のタスクの [状態] 列のセルの上にカーソルを置きます。

メモメモ
[並列タスク] ウィンドウでは、待機チェーン トラバーサル (WCT) でサポートされる同期プリミティブを使用する、ブロックされているタスクに関してのみ、デッドロックが報告されます。たとえば、WCT を使用するデッドロック状態の Task オブジェクトに対して、デバッガーは "待機中デッドロック" を報告します。同時実行ランタイムによって管理されるデッドロック状態のタスクに対して、デバッガーは "待機中" を報告します。WCT の詳細については、「Wait Chain Traversal (待機チェーン トラバーサル)」を参照してください。

場所

タスクの呼び出し履歴内の現在の位置です。 タスクのすべての呼び出し履歴を表示するには、このセルの上にカーソルを置きます。 スケジュール状態のタスクについては、このセルには値が表示されません。

タスク

最初のメソッドと、作成時にタスクに渡された引数です。

このタスクを作成したタスクの ID です。 この列が空白のタスクには親はありません。 これは、マネージ プログラムの場合にのみ適用されます。

スレッドの割り当て

タスクを実行しているスレッドの ID と名前です。

AppDomain

マネージ コード用の情報で、タスクを実行しているアプリケーション ドメインを示します。

task_group

ネイティブ コード用の情報で、タスクのスケジュールを設定した task_group オブジェクトのアドレスを示します。 非同期エージェントおよび軽量タスクでは、この列は 0 に設定されます。

ビューに列を追加するには、列見出しを右クリックし、追加する列を選択します (列を削除するには選択を解除します)。また、列を左右にドラッグして列の順序を変更することもできます。 列のショートカット メニューを次の図に示します。

並列タスク コンテキスト メニュー

タスクの並べ替え

列を基準にタスクを並べ替えるには、列ヘッダーをクリックします。 たとえば、[ID] 列の列ヘッダーをクリックすると、タスクをタスク ID 順 (1、2、3、4、5...) に並べ替えることができます。 並べ替え順序を逆にするには、もう一度列ヘッダーをクリックします。 現在の並べ替え列と並べ替え順序は、列に矢印で示されます。

タスクのグループ化

リスト ビューの任意の列に基づいてタスクをグループ化することができます。 たとえば、[状態] 列の列ヘッダーを右クリックして [状態でグループ化] をクリックすると、状態が同じすべてのタスクをグループ化できます。 このようにすると、たとえば待機中のタスクをすばやく表示して、ブロックされている理由を集中的に確認することができます。 また、デバッグ セッションでは関係のないグループを折りたたむこともできます。 他の列を基準にしても、同じようにしてグループ化できます。 グループに対しては、グループ ヘッダーの横にあるボタンをクリックするだけで、まとめてフラグを設定したり解除したりすることができます。 次の図は、グループ化されたモードの [並列タスク] ウィンドウを示しています。

グループ化された並列タスク モード

親子ビュー

このビューは、マネージ コードの場合のみ使用できます。列見出しを右クリックして [親子ビュー] をクリックすると、タスクの一覧を階層ビューに切り替えることができます。階層ビューでは、すべての子タスクが、表示と非表示を切り替えることができるサブノードとして親の下に表示されます。 次の図は、親子ビューでのタスクの表示を示しています。

並列タスクの親子ビュー

タスクに対するフラグの設定

タスク一覧の項目を右クリックして [フラグ設定] をクリックするか、最初の列のフラグ アイコンをクリックすると、タスクにフラグを設定することができます。 複数のタスクにフラグを設定してそれらだけを集中して確認する場合、フラグ列で並べ替えを行うことで、フラグを設定したすべてのタスクが上に表示されるようにすることができます。 [並列スタック] ウィンドウを使用して、フラグを設定したタスクだけを表示することもできます。 これにより、デバッグには関係のないタスクを除外することができます。 フラグはデバッグ セッション間で保持されません。

タスクの凍結と凍結解除

タスク一覧の項目を右クリックして [割り当てられたスレッドを凍結] をクリックすると、タスクを実行しているスレッドを凍結することができます (タスクが既に凍結されている場合は、コマンドは [割り当てられたスレッドの凍結を解除] になります)。スレッドを凍結すると、現在のブレークポイントの後のコードのステップ実行でそのスレッドが実行されなくなります。 [これ以外のすべてのスレッドを凍結] を使用すると、タスク一覧の項目を実行しているスレッドを除くすべてのスレッドが凍結されます。

各タスクのその他のメニュー項目を次の図に示します。

並列タスク コンテキスト メニュー

参照

処理手順

チュートリアル: 並行アプリケーションのデバッグ

概念

.NET Framework の並列プログラミング

同時実行ランタイム

その他の技術情報

デバッガーのロードマップ

マネージ コードのデバッグ

[並列スタック] ウィンドウの使用

履歴の変更

日付

履歴

理由

2011 年 3 月

デバッガーによるデッドロックの報告に関する情報を追加しました。

情報の拡充