C# - 런타임 환경에 따라 달라진 AppDomain.GetCurrentThreadId 메서드
AppDomain.GetCurrentThreadId 메서드를 사용한 다음의 코드를,
using System;
using System.Runtime.InteropServices;
internal class Program
{
[DllImport("kernel32.dll")]
static extern long GetCurrentThreadId();
static void Main(string[] args)
{
Console.WriteLine($"Runtime Version: {Environment.Version}");
Console.WriteLine();
long idFromNative = GetCurrentThreadId();
int idFromAppDomain = AppDomain.GetCurrentThreadId();
long idFromThread = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"{idFromAppDomain}, {idFromThread}, {idFromNative}");
}
}
(현재 기준 LTS 버전 지원 중인) .NET Core 3.1+ 환경에서 실행하면 이런 결과가 나옵니다.
Runtime Version: 3.1.23
1, 1, 21964
반면, .NET Framework 4.8 이하에서 실행하면 이렇게 나옵니다.
Runtime Version: 4.0.30319.42000
21964, 1, 21964
그러니까, .NET Core부터는 적어도 Native Thread ID를 구하는 .NET BCL 지원은 없어진 것이고, 그게 필요하다면 Platform Invoke(윈도우의 경우
GetCurrentThreadId)를 통해서만 해결할 수 있습니다.
참고로, "현재" 스레드의 Native ID가 아니라면, 즉, 모든 스레드의 Native ID를 구하는 경우라면
ProcessThread를 이용할 수도 있습니다.
foreach (ProcessThread pthread in Process.GetCurrentProcess().Threads)
{
Console.WriteLine(pthread.Id);
}
아쉬운 것은, 현재 스레드와 ProcessThread를 매칭시킬 방법이 없다는 것입니다. (어쩔 수 없이 DllImport 시킨 GetCurrentThreadId를 사용해야 합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]