L'obtention de l'ID de thread à partir d'un thread
En C# lors du débogage de threads par exemple, vous pouvez voir chaque thread ID.
Je ne pouvais pas trouver un moyen d'obtenir ce même thread, par programmation. Je ne pouvais même pas obtenir l'ID du thread courant (dans les propriétés de la Thread.currentThread
).
Alors, je me demande comment Visual Studio obtenir l'Id de threads, et est-il un moyen d'obtenir la poignée du fil avec id d' 2345
, par exemple?
Vous devez vous connecter pour publier un commentaire.
GetThreadId
renvoie l'ID du thread natif. Il y a des façons de le faire fonctionner avec la gestion des threads, je suis sûr que tout ce que vous avez besoin de trouver le fil de la poignée et de le passer à la fonction.GetCurrentThreadId
renvoie l'ID du thread courant.GetCurrentThreadId
a été abandonnée depuis .NET 2.0: la méthode recommandée est laThread.CurrentThread.ManagedThreadId
propriété.System.Threading.Thread.CurrentThread.ManagedThreadId
ne fonctionne pas, au moins lors de l'utilisation dans unSetWindowsHookEx
. Au lieu de cela, nous avons pour obtenir l'id de thread de la native win32 fonctionGetCurrentThreadId()
.Ce sera l'Id de la gestion des threads.
ManagedThreadId
est un membre deThread
de sorte que vous pouvez obtenir l'Id de partir de n'importe quel Fil objet. Ainsi, vous obtenez le courant ManagedThreadID:Pour obtenir un OS thread par les OS ID de thread (pas ManagedThreadID), vous pouvez essayer un peu de linq.
Il semble y avoir aucun moyen de les énumérer la gestion des threads et de l'absence de lien entre ProcessThread et du Fil, afin d'obtenir un thread géré par il est Id est difficile.
Pour plus de détails sur Gérés vs non géré filetage voir cette MSDN arcticle.
Vous pouvez utiliser le obsolète
domaine d'application.GetCurrentThreadId
pour obtenir l'ID du thread en cours d'exécution. Cette méthode utilise un PInvoke à l'API Win32 méthodeGetCurrentThreadID
, et sera de retour le Windows ID de thread.Cette méthode est marqué comme obsolète à cause de la .NET Thread objet ne correspond pas à un seul thread Windows, et en tant que tel il n'est pas stable ID qui peut être retourné par Windows pour une commande donnée .NET le fil de discussion.
Voir configurateur de réponse pour plusieurs raisons pourquoi cela est le cas.
Pour obtenir le système d'exploitation nom de l'utiliser:
AppDomain.GetCurrentThreadId()
est obsolète:AppDomain.GetCurrentThreadId
a été abandonné car il ne fournit pas un stable Id lors de la gestion des threads en cours d'exécution surfibers (aka lightweight threads)
. Pour obtenir un identifiant stable pour une gestion thread, utilisez laManagedThreadId
bien surThread
. Utilisation:Thread.CurrentThread.ManagedThreadId
Selon MSDN:
Donc, fondamentalement, les
Thread
objet ne correspond pas nécessairement à un OS du thread, c'est pourquoi il n'a pas la native ID exposés.Pour ceux sur le point de hack:
De trouver le thread courant Id d'utilisation - `Thread.CurrentThread.ManagedThreadId'.
Mais dans ce cas, vous pourriez avoir besoin de l'actuel win32 id de thread - utilisation pInvoke de le faire avec cette fonction:
D'abord, vous aurez besoin d'enregistrer l'id de thread géré et win32 id de thread de connexion - utiliser un dictionnaire qui associe un win32 id de thread géré.
Puis de trouver un thread par l'id d'itérer le processus de thread à l'aide de Processus.Fonction getcurrentprocess().Fils et trouver le fil avec id:
ProcessThread
objets, ce n'est pas la même chose que (ni hériter)Thread
:(thread as Thread)
sera de retour d'une référence null.Le décalage sous Windows 10 est 0x022C (64 bits) et la 0x0160 (32 bits de l'Application):
Système.Le filetage.Fil de discussion.CurrentThread.NomDe code managé, vous avez accès à des instances de la
Thread
type pour chaque thread.Thread
encapsule le concept d'un OS de thread et de l'CLR il y a un one-to-one correspondance avec la gestion des threads et des OS de threads. Cependant, c'est un détail d'implémentation, ce qui peut changer dans le futur.L'ID affiché par Visual Studio est en fait l'OS ID de thread. C'est pas le même que l'ID de thread géré comme suggéré par plusieurs réponses.
La
Thread
type n'incluent une salle de IntPtr membre champ appeléDONT_USE_InternalThread
, ce qui souligne l'OS sous-jacent à la structure. Cependant, comme c'est vraiment un détail d'implémentation, il n'est pas conseillé de poursuivre cette OMI. Et le nom sorte de, indique que vous ne devriez pas compter sur cette.Vous pouvez utiliser Thread.GetHashCode, qui renvoie l'ID de thread géré. Si vous pensez à la fin de GetHashCode, ce qui rend le bon sens -- cela doit être un identifiant unique (par exemple une clé dans un dictionnaire) de l'objet (le fil).
La source de référence pour la classe Thread est riche en enseignements. (Certes, un particulier .NET de la mise en œuvre peut pas être basé sur ce code source, mais à des fins de débogage, je vais prendre mes chances.)
GetHashCode "fournit ce code de hachage pour les algorithmes qui ont besoin de vérifications rapides de l'objet de l'égalité", il est donc bien adapté pour le contrôle de Fil de l'égalité, par exemple à affirmer qu'une méthode particulière est en cours d'exécution sur le fil que vous avez voulu appelé à partir.