En C # al depurar hilos, por ejemplo, puede ver la identificación de cada hilo.
No pude encontrar una manera de obtener ese mismo hilo, programáticamente. Ni siquiera pude obtener la ID del hilo actual (en las propiedades de laThread.currentThread
).
Entonces, me pregunto cómo obtiene Visual Studio las ID de los subprocesos, y ¿hay alguna manera de obtener el identificador del subproceso con id 2345
, por ejemplo?
fuente
System.Threading.Thread.CurrentThread.ManagedThreadId
no funcionará al menos cuando se usa en unSetWindowsHookEx
. En su lugar, tenemos que obtener la identificación del hilo de la función nativa win32GetCurrentThreadId()
.Este será el ID de los hilos gestionados.
ManagedThreadId
es miembro de,Thread
por lo que puede obtener el ID de cualquier subproceso objeto . Esto le dará el ManagedThreadID actual :Para obtener un subproceso del sistema operativo por su ID de subproceso del sistema operativo (no ManagedThreadID) , puede probar un poco de linq.
Parece que no hay forma de enumerar los subprocesos administrados y no hay relación entre ProcessThread y Thread, por lo que obtener un subproceso administrado por su Id es difícil.
Para obtener más detalles sobre subprocesos administrados y no administrados, consulte este artículo de MSDN .
fuente
Puede usar el obsoleto
AppDomain.GetCurrentThreadId
para obtener la ID del subproceso que se está ejecutando actualmente. Este método utiliza un PInvoke para el método Win32 APIGetCurrentThreadID
y devolverá el ID del hilo de Windows.Este método está marcado como obsoleto porque el objeto .NET Thread no corresponde a un solo hilo de Windows y, como tal, no hay una identificación estable que pueda devolver Windows para un hilo .NET determinado.
Vea la respuesta del configurador para más razones por las cuales este es el caso.
fuente
Para obtener el ID del sistema operativo, use:
fuente
AppDomain.GetCurrentThreadId()
está obsoleto:AppDomain.GetCurrentThreadId
ha quedado en desuso porque no proporciona un Id estable cuando se ejecutan subprocesos administradosfibers (aka lightweight threads)
. Para obtener un identificador estable para un hilo administrado, use laManagedThreadId
propiedad enThread
. Uso:Thread.CurrentThread.ManagedThreadId
De acuerdo con MSDN :
Básicamente, el
Thread
objeto no se corresponde necesariamente con un subproceso del sistema operativo, por lo que no tiene la identificación nativa expuesta.fuente
Para aquellos a punto de hackear:
fuente
Para encontrar el Id. De hilo actual, use - `Thread.CurrentThread.ManagedThreadId '. Pero en este caso, es posible que necesite la identificación actual del subproceso win32: use pInvoke para obtenerlo con esta función:
Primero, deberá guardar la identificación del subproceso administrado y la conexión de la identificación del subproceso win32: use un diccionario que asigne una identificación de win32 al subproceso administrado.
Luego, para encontrar un subproceso por su id, itere sobre el subproceso del proceso usando Process.GetCurrentProcess (). Subprocesos y encuentre el subproceso con ese id:
fuente
ProcessThread
objetos, esto no es lo mismo que (ni hereda)Thread
:(thread as Thread)
devolverá una referencia nula.El desplazamiento en Windows 10 es 0x022C (x64-bit-Application) y 0x0160 (x32-bit-Application):
fuente
System.Threading.Thread.CurrentThread.Namefuente
Desde el código administrado tiene acceso a instancias del
Thread
tipo para cada subproceso administrado.Thread
encapsula el concepto de un subproceso del sistema operativo y, a partir del CLR actual, existe una correspondencia uno a uno con subprocesos administrados y subprocesos del sistema operativo. Sin embargo, este es un detalle de implementación que puede cambiar en el futuro.El ID que muestra Visual Studio es en realidad el ID del hilo del sistema operativo. Esto no es mismo que el ID de hilo administrado como lo sugieren varias respuestas.
El
Thread
tipo incluye un campo de miembro IntPtr privado llamadoDONT_USE_InternalThread
, que apunta a la estructura subyacente del sistema operativo. Sin embargo, como esto es realmente un detalle de implementación, no es aconsejable seguir esta OMI. Y el nombre indica que no debes confiar en esto.fuente
Puede usar Thread.GetHashCode, que devuelve el ID del hilo administrado. Si piensa en el propósito de GetHashCode, esto tiene sentido: debe ser un identificador único (por ejemplo, clave en un diccionario) para el objeto (el hilo).
La fuente de referencia para la clase Thread es instructiva aquí. (De acuerdo, una implementación particular de .NET puede no estar basada en este código fuente, pero para propósitos de depuración, me arriesgaré).
GetHashCode "proporciona este código hash para algoritmos que necesitan comprobaciones rápidas de la igualdad de objetos", por lo que es muy adecuado para verificar la igualdad de subprocesos, por ejemplo, para afirmar que un método en particular se está ejecutando en el subproceso desde el que desea que se llame.
fuente