371 votes

Obtenir l’ID de thread d’un thread

En langage c# lors du débogage des threads par exemple, vous pouvez voir les ID. de chaque thread

Je ne pouvais pas trouver un moyen pour obtenir ce même thread, par programme. Je ne pouvais même pas obtenir l’ID du thread en cours (dans les propriétés de le `` ).

Donc, je me demande comment Visual Studio obtient-il les ID des threads, et y a-t-il un moyen pour obtenir le handle du thread avec l’id `` , par exemple ?

496voto

Blindy Points 26706

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.

Pour la dernière version de .NET, le courant recommandé façon de faire est - System.Threading.Thread.CurrentThread.ManagedThreadId.

96voto

badbod99 Points 3588

En C# lors du débogage de threads par exemple, vous pouvez voir chaque thread ID.

Ce sera l'Id de la gestion des threads. ManagedThreadId est membre de l' Thread de sorte que vous pouvez obtenir l'Id de partir de n'importe quel Thread de l'objet. Ainsi, vous obtenez le courant ManagedThreadID:

Thread.CurrentThread.ManagedThreadId

Pour obtenir un OS thread par les OS ID de thread (pas ManagedThreadID), vous pouvez essayer un peu de linq.

int unmanagedId = 2345;
ProcessThread myThread = (from ProcessThread entry in Process.GetCurrentProcess().Threads
   where entry.Id == unmanagedId 
   select entry).First();

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 ce MSDN arcticle.

50voto

Tragedian Points 12308

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 à l'API Win32 méthode GetCurrentThreadID, 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.

36voto

Mark Byers Points 318575

Pour obtenir l'ID du système d'exploitation, utilisez:

 AppDomain.GetCurrentThreadId()
 

23voto

configurator Points 15594

Selon MSDN:

Un système d'exploitation de ThreadId n'a pas de relation fixe à un gérés thread, car un hôte non managé peut le contrôle de la relation entre gérés et non gérés threads. Plus précisément, un système sophistiqué de l'hôte peut utiliser le CLR API d'Hébergement à l'annexe de nombreux géré filets contre le même thread de système d'exploitation, ou pour déplacer un géré fil entre les différents threads du système d'exploitation.

Donc, fondamentalement, l' Thread objet ne correspond pas nécessairement à un OS du thread, c'est pourquoi il n'a pas le natif de l'ID de l'exposé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X