In C # können Sie beispielsweise beim Debuggen von Threads die ID jedes Threads sehen.
Ich konnte keinen Weg finden, programmgesteuert denselben Thread zu erhalten. Ich konnte nicht einmal die ID des aktuellen Threads (in den Eigenschaften von Thread.currentThread
) erhalten.
Ich frage mich also, wie Visual Studio die IDs der Threads erhält. Gibt es beispielsweise eine Möglichkeit, das Handle des Threads mit der ID 2345
abzurufen?
quelle
System.Threading.Thread.CurrentThread.ManagedThreadId
zumindest bei Verwendung in a nicht funktioniertSetWindowsHookEx
. Stattdessen müssen wir die Thread-ID von der nativen win32-Funktion abrufenGetCurrentThreadId()
.Dies sind die IDs der verwalteten Threads.
ManagedThreadId
ist ein Mitglied von,Thread
sodass Sie die ID von jedem Thread- Objekt abrufen können . Dadurch erhalten Sie die aktuelle ManagedThreadID :Um einen OS-Thread anhand seiner OS-Thread-ID (nicht ManagedThreadID) zu erhalten , können Sie ein wenig linq ausprobieren.
Es scheint, dass es keine Möglichkeit gibt, die verwalteten Threads und keine Beziehung zwischen ProcessThread und Thread aufzulisten. Daher ist es schwierig, einen verwalteten Thread anhand seiner ID zu erhalten.
Weitere Informationen zu verwaltetem und nicht verwaltetem Threading finden Sie in diesem MSDN-Artikel .
quelle
Sie können das Veraltete verwenden
AppDomain.GetCurrentThreadId
, um die ID des aktuell ausgeführten Threads abzurufen. Diese Methode verwendet einen PInvoke für die Win32-API-MethodeGetCurrentThreadID
und gibt die Windows-Thread-ID zurück.Diese Methode wird als veraltet markiert, da das .NET-Thread-Objekt keinem einzelnen Windows-Thread entspricht und daher keine stabile ID vorhanden ist, die von Windows für einen bestimmten .NET-Thread zurückgegeben werden kann.
Weitere Gründe, warum dies der Fall ist, finden Sie in der Antwort des Konfigurators.
quelle
Um die Betriebssystem-ID zu erhalten, verwenden Sie:
quelle
AppDomain.GetCurrentThreadId()
ist veraltet:AppDomain.GetCurrentThreadId
wurde veraltet, da es keine stabile ID liefert, wenn verwaltete Threads ausgeführt werdenfibers (aka lightweight threads)
. Verwenden Sie dieManagedThreadId
Eigenschaft on, um eine stabile Kennung für einen verwalteten Thread zu erhaltenThread
. Verwendung:Thread.CurrentThread.ManagedThreadId
Laut MSDN :
Im Grunde genommen entspricht das
Thread
Objekt nicht unbedingt einem Betriebssystem-Thread - weshalb die native ID nicht verfügbar ist.quelle
Für diejenigen, die kurz vor dem Hack stehen:
quelle
Um die aktuelle Thread-ID zu finden, verwenden Sie "Thread.CurrentThread.ManagedThreadId". In diesem Fall benötigen Sie möglicherweise die aktuelle Win32-Thread-ID. Verwenden Sie pInvoke, um diese Funktion abzurufen:
Zuerst müssen Sie die Verbindung zwischen verwaltetem Thread und Win32-Thread-ID speichern. Verwenden Sie ein Wörterbuch, das eine Win32-ID dem verwalteten Thread zuordnet.
Um dann einen Thread anhand seiner ID zu finden, iterieren Sie mit Process.GetCurrentProcess () über den Thread des Prozesses. Threads und suchen Sie den Thread mit dieser ID:
quelle
ProcessThread
Objekte, das ist nicht das gleiche wie (noch tut es erben)Thread
:(thread as Thread)
eine Null - Referenz zurück.Der Offset unter Windows 10 ist 0x022C (x64-Bit-Anwendung) und 0x0160 (x32-Bit-Anwendung):
quelle
System.Threading.Thread.CurrentThread.Namequelle
Über verwalteten Code haben Sie Zugriff auf Instanzen des
Thread
Typs für jeden verwalteten Thread.Thread
kapselt das Konzept eines Betriebssystem-Threads und ab der aktuellen CLR gibt es eine Eins-zu-Eins-Entsprechung zu verwalteten Threads und Betriebssystem-Threads. Dies ist jedoch ein Implementierungsdetail, das sich in Zukunft ändern kann.Die von Visual Studio angezeigte ID ist tatsächlich die Betriebssystem-Thread-ID. Dies entspricht nicht der ID des verwalteten Threads, wie in mehreren Antworten vorgeschlagen.
Der
Thread
Typ enthält ein privates IntPtr-Mitgliedsfeld mit dem NamenDONT_USE_InternalThread
, das auf die zugrunde liegende Betriebssystemstruktur verweist. Da dies jedoch wirklich ein Implementierungsdetail ist, ist es nicht ratsam, diese IMO fortzusetzen. Und der Name zeigt an, dass Sie sich nicht darauf verlassen sollten.quelle
Sie können Thread.GetHashCode verwenden, der die verwaltete Thread-ID zurückgibt. Wenn Sie über den Zweck von GetHashCode nachdenken, ist dies sinnvoll - es muss eine eindeutige Kennung (z. B. Schlüssel in einem Wörterbuch) für das Objekt (den Thread) sein.
Die Referenzquelle für die Thread-Klasse ist hier aufschlussreich . (Zugegeben, eine bestimmte .NET-Implementierung basiert möglicherweise nicht auf diesem Quellcode, aber zu Debugging-Zwecken gehe ich mein Risiko ein.)
GetHashCode "stellt diesen Hash-Code für Algorithmen bereit, bei denen die Objektgleichheit schnell überprüft werden muss ". Daher eignet es sich gut zum Überprüfen der Thread-Gleichheit, um beispielsweise zu behaupten, dass eine bestimmte Methode auf dem Thread ausgeführt wird, von dem aus sie aufgerufen werden soll.
quelle