web-dev-qa-db-ja.com

Task.StartNew使用時にスレッド名を指定する

Task.StartNewメソッドを使用するときにスレッドの名前を指定する方法はありますか?

var task = Task.Factory.StartNew(MyAction, TaskCreationOption.LongRunning, ??ThreadName??);
28
Jon

確かにスレッド名ではありません。

スレッドとタスクは1対1の関係ではありません。

Task.Idを使用して追跡できます。

17
Henk Holterman

まあ、これはうまくいきます:

class Program {
    static void Main(string[] args) {
        var task = Task.Factory.StartNew(() => {
            Thread.CurrentThread.Name = "foo";
            Thread.Sleep(10000);   // Use Debug + Break to see it
        });
        task.Wait();
    }
}

ただし、問題がありますが、スレッドプールスレッドはリサイクルされ、名前は変更されません。これは混乱を招く可能性があり、後でまったく異なるコードを実行して実行されることがわかります。これに注意してください。それ以外の場合の最善の策は、[デバッグ+ウィンドウ+スレッド]ウィンドウの[場所]列を使用して、タスクを見つけることです。

33
Hans Passant

私はThread.CurrentThread.ManagedThreadIdを使用することを好みます。名前ほど良くはありませんが、スレッドの特定の作業を追跡するのに役立ちます。

2
paultechguy

タスクはスレッドプールを使用し、スレッドに名前を付けることができるのは1回だけです。できることは、ThreadStatic変数を使用することです。ただし、タスク間で有効になるため、すべてのタスクで再度設定してください。

0
SijeDeHaan