Como ejercicio, estaba escribiendo un código para mostrar los procesos O/S y subprocesos O/S dentro de un proceso (como lo hace el explorador de procesos Sysinternals).¿Cómo obtengo el ID del hilo _real_ de una manera CLR "amigable"?
Encontré que .NET's ManagedThreadId (s) no son los identificadores de subprocesos O/S. Después de leer un poco, me encontré con 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 GetCurrentThreadId de Win32. Estoy de acuerdo con eso, pero se opone a la filosofía .net.
Mi pregunta es: ¿hay una forma CLR "amigable" de obtener la identificación real del hilo actual?
Como referencia, aquí hay un fragmento de código que muestra lo que he intentado hasta ahora. // 1 y // 2 muestran el ID del hilo correcto, // 3 y // 4 intentaron obtener la misma información de forma CLR amigable (pero no funcionan).
Gracias por su 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);
}
¿Por qué querría una forma "amigable" de CLR para obtener datos de CLR "poco amigables" sobre los cuales solo puede ejecutar operaciones "hostiles" de CLR? – Polity
@Polity: escribo utilidades del sistema y la mayoría de ellas no tienen nada que ver con .net. Si programo en .net, me gustaría ser "amigable" con .net incluso si la información que me interesa no está relacionada con el entorno .net. – Hex440bx
Bueno, mi punto se mantiene válido :) no hay ninguna razón para construir parte de un automóvil de acero y la otra parte de madera. Al igual que no hay ninguna razón para obtener un threadID nativo en una forma amigable de .NET solo para usarlo con las API del sistema nativo. ¡Usar GetCurrentThreadId de Win32 es perfectamente válido en este caso! – Polity