2012-02-23 12 views
12

デバッグ時にネーミングスレッドが非常に役立つことがわかりました。タスクを実行しているスレッドに名前を付けるにはどうすればよいですか?

私はTask.Factory.StartNew()

に引数を使用してスレッドを命名する方法を見ることができないので、それは仕事の中で明示的にスレッドに名前を付けるために許容できるのですか?例:

private void MyFunc() 
{ 
    Task.Factory.StartNew(() => 
    { 
     Thread.CurrentThread.Name = "Foobulizer"; 
     Foobulize(); 
    }); 
} 

しかし、私はスレッドが別のタスクで再利用されることに感謝します。タスクの最後に明示的にスレッド名をリセットする必要がありますか?これはかなりハッキーな感じがするので、これはおそらく悪い考えか、それを行う適切な方法があると思いますか?

答えて

14

複数のタスクが1つまたは複数のスレッドを共有できるので、これはできません。特定の瞬間にThreadPoolの状態に依存します。基本的にタスクはスレッドではありませんが、これは非同期操作の単なる抽象度です。 Task.Idプロパティを使用できますが、Idは読み取り専用であり、intタイプなので、ユーザーフレンドリなカスタム名を割り当てることはできません。

タスクIDのオンデマンド割り当てられ、必ずしもタスクインスタンスが

あなたはおそらく、Visual Studioで構築された2010パラレルデバッグ機能を見てみましょうを作成された 順序を表すものではありませんWalkthrough: Debugging a Parallel Application

並列タスクウィンドウ:

enter image description here

「他のアプローチを見つけるでしょうタスクを実行するごとに、

、あなたが持っているツールチップを表示するオーバーホバリング 同じ名前のプロパティによって返されるそのID、それを実行するスレッドのIDと名前、その 場所を(読むことができます全体が コールスタック)。また、[タスク]列の下には、 がタスクに渡されたメソッドが表示されます。言い換えれば、開始点

+0

関連するタスクアクションまたはメソッドでコードを「Task.CurrentId」として使用できます。 –

5

デフォルトのTaskSchedulerは、.NET ThreadPoolを使用してタスクをスケジュールします。つまり、すでに存在するスレッド、または再利用されるスレッド(潜在的にはどちらかと言えば可能性が高い)を取得します。

スレッドに名前を付けることができるのは1回だけです。 Thread.CurrentThread.Nameを呼び出す2回目の試みはInvalidOperationExceptionになります。これはスレッドプールスレッドの場合に特に悪いことです。

一般的には、(明示的に)作成または所有していないスレッドの属性を変更しないでください(名前は1で、他の顕著な候補はpriorityです)。

+0

あなたは一度しか名前をつけることができないことに気付かなかった。興味深い、ありがとう。 – GazTheDestroyer

-1

もちろん、完了したらもう一度名前を削除することができます。 Foobulize()の後にスレッド名を "Idle"に再度設定します。

+0

これはfalseです。Thread.Nameを複数回設定することはできません。 –

関連する問題