¿Cómo obtengo el id de subproceso _real_ de forma CLR "amigable"?

omo ejercicio, estaba escribiendo un código para mostrar los procesos O / S y los hilos O / S dentro de un proceso (como lo hace el explorador de procesos Sysinternals).

Encontré que ManagedThreadId (s) de .net no son los identificadores de subproceso O / S. Después de leer un poco, encontré AppDomain.GetCurrentThreadId (). Desafortunadamente, esa función está marcada como "obsoleta" (lo que podría significar "no disponible" en el futuro). Una solución que encontré es usar InteropServices para llamar directamente al Win32 GetCurrentThreadId. Estoy de acuerdo con eso, pero se siente contrario a la filosofía .net.

Mi pregunta es: ¿existe una forma "amigable" de CLR de obtener la identificación real del hilo actual?

Para referencia, aquí hay un fragmento de código que muestra lo que he intentado hasta ahora. // 1 y // 2 muestran la identificación correcta del hilo, // 3 y // 4 fueron intentos de obtener la misma información de manera amigable con CLR (pero no funcionan).

Gracias por tu ayuda

John

[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();

static void Main(string[] args)
{
  // AppDomain.GetCurrentThreadId() is "obsolete"

  int ThreadId1 = AppDomain.GetCurrentThreadId();   // 1 

  // not the ".net" way of doing things

  int ThreadId2 = GetCurrentThreadId();             // 2 

  // "no joy" attempts to get the same results I got above

  int ThreadId3 = Process.GetCurrentProcess().Threads[0].Id;   // 3
  int ThreadId4 = Thread.CurrentThread.ManagedThreadId;        // 4


  Console.WriteLine("ThreadId1: {0}, ThreadId2: {1}, ThreadId3: {2}, " + 
                    "ThreadId4: {3}",
                    ThreadId1, ThreadId2, ThreadId3, ThreadId4);
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta