367 Stimmen

Abfrage der Thread-ID eines Threads

In C# können Sie beim Debuggen von Threads zum Beispiel die ID jedes Threads sehen.

Ich konnte keine Möglichkeit finden, denselben Thread programmatisch zu erhalten. Ich konnte nicht einmal die ID des aktuellen Threads ermitteln (in den Eigenschaften des Thread.currentThread ).

Ich frage mich also, wie Visual Studio die IDs der Threads erhält, und gibt es eine Möglichkeit, das Handle des Threads mit id zu erhalten 2345 zum Beispiel?

489voto

Blindy Punkte 59463

GetThreadId gibt die ID eines bestimmten nativen Threads zurück. Es gibt Möglichkeiten, es mit verwalteten Threads funktionieren zu lassen, ich bin sicher, alles, was Sie brauchen, ist das Thread-Handle zu finden und es an diese Funktion zu übergeben.

GetCurrentThreadId gibt die ID des aktuellen Threads zurück.

GetCurrentThreadId ist seit .NET 2.0 veraltet: Die empfohlene Methode ist die Thread.CurrentThread.ManagedThreadId Eigentum.

96voto

badbod99 Punkte 7228

In C# können Sie beim Debuggen von Threads zum Beispiel die ID jedes Threads sehen.

Dies sind die Ids der verwalteten Threads. ManagedThreadId ist ein Mitglied von Thread so können Sie die Id von jedem Thema Objekt. Damit erhalten Sie das aktuelle ManagedThreadID :

Thread.CurrentThread.ManagedThreadId

Um einen OS-Thread anhand seiner OS-Thread-ID zu ermitteln (nicht ManagedThreadID) können Sie ein wenig Linq ausprobieren.

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

Es scheint, dass es keine Möglichkeit gibt, die verwalteten Threads aufzuzählen und keine Beziehung zwischen ProcessThread und Thread, so dass es schwierig ist, einen verwalteten Thread anhand seiner Id zu finden.

Weitere Einzelheiten zu Managed vs. Unmanaged Threading finden Sie unter dieser MSDN-Artikel .

50voto

Paul Turner Punkte 37044

Sie können die veraltete AppDomain.GetCurrentThreadId um die ID des aktuell laufenden Threads zu erhalten. Diese Methode verwendet einen PInvoke auf die Win32 API Methode GetCurrentThreadID und gibt die Windows-Thread-ID zurück.

Diese Methode ist als veraltet gekennzeichnet, da das .NET-Thread-Objekt nicht einem einzelnen Windows-Thread entspricht und es daher keine stabile ID gibt, die von Windows für einen bestimmten .NET-Thread zurückgegeben werden kann.

In der Antwort des Konfigurators finden Sie weitere Gründe, warum dies der Fall ist.

36voto

Mark Byers Punkte 761508

Um die OS-ID zu erhalten, verwenden Sie:

AppDomain.GetCurrentThreadId()

23voto

configurator Punkte 39516

Nach Angaben von MSDN :

Eine Betriebssystem-ThreadId hat keine feste Beziehung zu einer verwalteten Thread, denn ein nicht verwalteter Host kann die Beziehung zwischen verwalteten und nicht verwalteten Threads kontrollieren kann. Insbesondere kann ein anspruchsvoller Host die CLR-Hosting-API verwenden, um viele verwaltete Threads mit demselben Betriebssystem-Thread zu planen, oder einen verwalteten Threads zwischen verschiedenen Betriebssystem-Threads verschieben.

Im Grunde genommen ist also die Thread Objekt entspricht nicht notwendigerweise einem OS-Thread - deshalb hat es auch nicht die native ID offengelegt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X