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?

15voto

ezolotko Punkte 1705

Für diejenigen, die hacken wollen:

    public static int GetNativeThreadId(Thread thread)
    {
        var f = typeof(Thread).GetField("DONT_USE_InternalThread",
            BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

        var pInternalThread = (IntPtr)f.GetValue(thread);
        var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 548 : 348); // found by analyzing the memory
        return nativeId;
    }

13voto

Dror Helper Punkte 29647

Um die Kennung des aktuellen Threads zu ermitteln, verwenden Sie - `Thread.CurrentThread.ManagedThreadId'. Aber in diesem Fall benötigen Sie vielleicht die aktuelle Win32-Thread-ID - verwenden Sie pInvoke, um sie mit dieser Funktion zu erhalten:

[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();

Zuerst müssen Sie die Verbindung zwischen der verwalteten Thread-ID und der Win32-Thread-ID speichern - verwenden Sie ein Wörterbuch, das eine Win32-ID auf einen verwalteten Thread abbildet.

Um dann einen Thread anhand seiner Kennung zu finden, iterieren Sie mit Process.GetCurrentProcess().Threads über die Threads des Prozesses und suchen den Thread mit dieser Kennung:

foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
     var managedThread = win32ToManagedThread[thread.id];
     if((managedThread.ManagedThreadId == threadId)
     {
         return managedThread;
     }
}

13voto

Handball Reporter Punkte 131

Der Offset unter Windows 10 ist 0x022C (x64-bit-Anwendung) und 0x0160 (x32-bit-Anwendung):

public static int GetNativeThreadId(Thread thread)
{
    var f = typeof(Thread).GetField("DONT_USE_InternalThread",
        BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);

    var pInternalThread = (IntPtr)f.GetValue(thread);
    var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 0x022C : 0x0160); // found by analyzing the memory
    return nativeId;
}

5voto

Brian Rasmussen Punkte 112118

Von verwaltetem Code aus haben Sie Zugriff auf Instanzen der Thread Typ für jeden verwalteten Thread. Thread kapselt das Konzept eines OS-Threads und ab der aktuellen CLR gibt es eine Eins-zu-eins-Entsprechung zwischen verwalteten Threads und OS-Threads. Dies ist jedoch ein Implementierungsdetail, das sich in Zukunft ändern kann.

Die von Visual Studio angezeigte ID ist eigentlich die Thread-ID des Betriebssystems. Diese ist pas die gleiche wie die verwaltete Thread-ID, wie in mehreren Antworten vorgeschlagen.

Les Thread Typ enthält ein privates IntPtr-Mitgliedsfeld namens DONT_USE_InternalThread die auf die zugrundeliegende Betriebssystemstruktur verweist. Da es sich hierbei jedoch um ein Implementierungsdetail handelt, ist es IMO nicht ratsam, dies zu verfolgen. Und der Name deutet schon darauf hin, dass man sich nicht darauf verlassen sollte.

4voto

yoyo Punkte 7630

Sie können Thread.GetHashCode verwenden, das die verwaltete Thread-ID zurückgibt. Wenn Sie über den Zweck von GetHashCode nachdenken, ist dies durchaus sinnvoll - es muss ein eindeutiger Bezeichner (z. B. ein Schlüssel in einem Wörterbuch) für das Objekt (den Thread) sein.

Les Referenzquelle für die Klasse Thread ist hier lehrreich. (Zugegeben, eine bestimmte .NET-Implementierung Mai nicht auf diesem Quellcode basieren, aber für Debugging-Zwecke werde ich das Risiko eingehen).

GetHashCode "bietet diesen Hash-Code für Algorithmen, die eine schnelle Überprüfung der Objektgleichheit benötigen", so dass er sich gut für die Überprüfung der Thread-Gleichheit eignet - zum Beispiel um sicherzustellen, dass eine bestimmte Methode auf dem Thread ausgeführt wird, von dem aus sie aufgerufen werden soll.

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