En C # lors du débogage de threads par exemple, vous pouvez voir l'ID de chaque thread.
Je n'ai pas pu trouver un moyen d'obtenir ce même fil, par programme. Je n'ai même pas pu obtenir l'ID du thread actuel (dans les propriétés du Thread.currentThread
).
Donc, je me demande comment Visual Studio obtient les ID des threads, et est-il possible d'obtenir le handle du thread avec id 2345
, par exemple?
la source
System.Threading.Thread.CurrentThread.ManagedThreadId
cela ne fonctionnera pas au moins lors de l'utilisation dans unSetWindowsHookEx
. Au lieu de cela, nous devons obtenir l'ID du thread à partir de la fonction native win32GetCurrentThreadId()
.Ce seront les identifiants des threads gérés.
ManagedThreadId
est membre deThread
vous pouvez donc obtenir l'ID à partir de n'importe quel objet Thread . Cela vous donnera le ManagedThreadID actuel :Pour obtenir un thread OS par son ID de thread OS (pas ManagedThreadID) , vous pouvez essayer un peu de linq.
Il semble qu'il n'y ait aucun moyen d'énumérer les threads gérés et aucune relation entre ProcessThread et Thread, donc obtenir un thread géré par son ID est difficile.
Pour plus de détails sur le filetage géré vs non géré, consultez cet article MSDN .
la source
Vous pouvez utiliser le obsolète
AppDomain.GetCurrentThreadId
pour obtenir l'ID du thread en cours d'exécution. Cette méthode utilise un PInvoke à la méthode API Win32GetCurrentThreadID
et renverra l'ID de thread Windows.Cette méthode est marquée comme obsolète car l'objet .NET Thread ne correspond pas à un seul thread Windows, et en tant que tel, il n'y a pas d'ID stable qui peut être renvoyé par Windows pour un thread .NET donné.
Voir la réponse du configurateur pour plus de raisons pour lesquelles c'est le cas.
la source
Pour obtenir l'ID du système d'exploitation, utilisez:
la source
AppDomain.GetCurrentThreadId()
est obsolète:AppDomain.GetCurrentThreadId
a été déconseillé car il ne fournit pas d'ID stable lorsque les threads gérés s'exécutentfibers (aka lightweight threads)
. Pour obtenir un identifiant stable pour un thread géré, utilisez laManagedThreadId
propriété onThread
. Utilisation:Thread.CurrentThread.ManagedThreadId
Selon MSDN :
Donc, fondamentalement, l'
Thread
objet ne correspond pas nécessairement à un thread OS - c'est pourquoi il n'a pas l'ID natif exposé.la source
Pour ceux sur le point de pirater:
la source
Pour trouver l'ID de thread actuel, utilisez - `Thread.CurrentThread.ManagedThreadId '. Mais dans ce cas, vous pourriez avoir besoin de l'ID de thread Win32 actuel - utilisez pInvoke pour l'obtenir avec cette fonction:
Vous devez d'abord enregistrer l'ID de thread géré et la connexion d'ID de thread win32 - utilisez un dictionnaire qui mappe un identifiant win32 sur le thread géré.
Ensuite, pour rechercher un thread par son id, parcourez le thread du processus à l'aide de Process.GetCurrentProcess (). Threads et recherchez le thread avec cet id:
la source
ProcessThread
objets, ce n'est pas la même chose que (ni n'hérite)Thread
:(thread as Thread)
retournera une référence nulle.Le décalage sous Windows 10 est 0x022C (application x64 bits) et 0x0160 (application x32 bits):
la source
System.Threading.Thread.CurrentThread.Namela source
A partir du code managé, vous avez accès aux instances du
Thread
type pour chaque thread managé.Thread
encapsule le concept d'un thread OS et depuis le CLR actuel, il existe une correspondance biunivoque avec les threads gérés et les threads OS. Cependant, il s'agit d'un détail de mise en œuvre, qui pourrait changer à l'avenir.L'ID affiché par Visual Studio est en fait l'ID de thread du système d'exploitation. Ce n'est pas la même chose que l'ID de thread géré comme suggéré par plusieurs réponses.
Le
Thread
type inclut un champ membre IntPtr privé appeléDONT_USE_InternalThread
, qui pointe vers la structure du système d'exploitation sous-jacent. Cependant, comme il s'agit vraiment d'un détail de mise en œuvre, il n'est pas conseillé de poursuivre cette OMI. Et le nom indique en quelque sorte que vous ne devriez pas vous fier à cela.la source
Vous pouvez utiliser Thread.GetHashCode, qui renvoie l'ID de thread géré. Si vous pensez à l'objectif de GetHashCode, cela a du bon sens - il doit s'agir d'un identifiant unique (par exemple, la clé d'un dictionnaire) pour l'objet (le thread).
La source de référence pour la classe Thread est instructive ici. (Certes, une implémentation particulière de .NET peut ne pas être basée sur ce code source, mais à des fins de débogage, je vais tenter ma chance.)
GetHashCode "fournit ce code de hachage pour les algorithmes qui nécessitent des vérifications rapides de l'égalité des objets", il est donc bien adapté pour vérifier l'égalité des threads - par exemple pour affirmer qu'une méthode particulière s'exécute sur le thread à partir duquel vous souhaitez qu'elle soit appelée.
la source