PG日誌

読者です 読者をやめる 読者になる 読者になる

PG日誌

主にc#の事を書いています

c#でスレッドIDを取得する


f:id:Takachan:20170115150341j:plain

マルチスレッド処理中にログを出力したい時にスレッド番号があったらいいなと思ったので調べてみました。

捕捉:
GUIアプリのasync/await/Invokeが絡む画面操作関係でこの出力すると全部同じ値になってしまいます。UIがシングルスレッドアパートメントなので当たり前なのですが...

推奨の取得方法

int id = System.Threading.Thread.CurrentThread.ManagedThreadId
Console.WriteLine("ThreadID : " + id);
// ThreadID : 50

MS非推奨な取得方法も載せておきます。(MSDNだともう使えない風の記述がありますがまだ残ってますね)

int id = AppDomain.GetCurrentThreadId();
Console.WriteLine("ThreadID : " + id);
// ThreadID : 2440

このメソッドの宣言を覗くと

//
// 概要:
//     現在のスレッドの識別子を取得します。
//
// 戻り値:
//     現在のスレッドの識別子を表す 32 ビット符号付き整数。
public extern static int GetCurrentThreadId();

となっていて、externの記述があるので自前で(たぶん)Win32APIを呼び出した時と同じですね。

// Win32APIの呼び出しをラップするクラス
public class Win32
{
    [DllImport("kernel32.dll")]
    public static extern uint GetCurrentThreadId();
}

public void Main(string[] args)
{
    int id = Win32.GetCurrentThreadId();
    Console.WriteLine("ThreadID : " + id);
    // ThreadID : 1181
}

わざわざ(いつの間にか消えてコンパイルエラーになる)非推奨や(保守性や互換性が低下する)相互運用をわざわざ選ぶ必要はないので素直にManagedThreadId使いましょう。