Na przykład w języku C # podczas debugowania wątków można zobaczyć identyfikator każdego wątku.
Programowo nie mogłem znaleźć sposobu na uzyskanie tego samego wątku. Nie mogłem nawet uzyskać identyfikatora bieżącego wątku (we właściwościach Thread.currentThread
).
Zastanawiam się więc, w jaki sposób Visual Studio pobiera identyfikatory wątków i czy istnieje sposób na uzyskanie uchwytu wątku o identyfikatorze 2345
, na przykład?
źródło
System.Threading.Thread.CurrentThread.ManagedThreadId
nie zadziała przynajmniej w przypadku używania wSetWindowsHookEx
. Zamiast tego musimy uzyskać identyfikator wątku z natywnej funkcji win32GetCurrentThreadId()
.To będą identyfikatory zarządzanych wątków.
ManagedThreadId
jest członkiem,Thread
dzięki czemu możesz uzyskać identyfikator z dowolnego obiektu wątku . Otrzymasz bieżący identyfikator ManagedThreadID :Aby uzyskać wątek systemu operacyjnego według jego identyfikatora wątku systemu operacyjnego (nie ManagedThreadID) , możesz wypróbować trochę linq.
Wydaje się, że nie ma sposobu na wyliczenie zarządzanych wątków i brak relacji między ProcessThread a Threadem, więc uzyskanie zarządzanego wątku na podstawie jego Id jest trudne.
Aby uzyskać więcej informacji na temat wątków zarządzanych i niezarządzanych, zobacz ten artykuł MSDN .
źródło
Możesz użyć przestarzałego,
AppDomain.GetCurrentThreadId
aby uzyskać identyfikator aktualnie uruchomionego wątku. Ta metoda używa metody PInvoke do metody Win32 APIGetCurrentThreadID
i zwraca identyfikator wątku systemu Windows.Ta metoda jest oznaczona jako przestarzała, ponieważ obiekt wątku .NET nie odpowiada pojedynczemu wątkowi systemu Windows i jako taki nie ma stabilnego identyfikatora, który mógłby zostać zwrócony przez system Windows dla danego wątku .NET.
Zobacz odpowiedź konfiguratora, aby uzyskać więcej powodów, dla których tak jest.
źródło
Aby uzyskać identyfikator systemu operacyjnego, użyj:
źródło
AppDomain.GetCurrentThreadId()
jest przestarzały:AppDomain.GetCurrentThreadId
został uznany za przestarzały, ponieważ nie zapewnia stabilnego identyfikatora podczas działania zarządzanych wątkówfibers (aka lightweight threads)
. Aby uzyskać stabilny identyfikator zarządzanego wątku, użyjManagedThreadId
właściwości naThread
. Zastosowanie:Thread.CurrentThread.ManagedThreadId
Według MSDN :
Zasadniczo więc
Thread
obiekt niekoniecznie odpowiada wątkowi systemu operacyjnego - dlatego nie ma ujawnionego natywnego identyfikatora.źródło
Dla tych, którzy zamierzają włamać się:
źródło
Aby znaleźć bieżący identyfikator wątku, użyj - `Thread.CurrentThread.ManagedThreadId '. Ale w tym przypadku może być potrzebny bieżący identyfikator wątku win32 - użyj pInvoke, aby uzyskać go za pomocą tej funkcji:
Najpierw musisz zapisać identyfikator zarządzanego wątku i połączenie identyfikatora wątku win32 - użyj słownika odwzorowującego identyfikator win32 na zarządzany wątek.
Następnie, aby znaleźć wątek według jego id, iteruj go po wątku procesu za pomocą Process.GetCurrentProcess (). Wątki i znajdź wątek o tym identyfikatorze:
źródło
ProcessThread
obiektów, to nie jest to samo co (ani nie dziedziczy)Thread
:(thread as Thread)
zwróci odwołanie zerowe.Przesunięcie w systemie Windows 10 to 0x022C (aplikacja x64-bit) i 0x0160 (aplikacja x32-bit):
źródło
System.Threading.Thread.CurrentThread.Nameźródło
Z kodu zarządzanego masz dostęp do instancji
Thread
typu dla każdego zarządzanego wątku.Thread
zawiera koncepcję wątku systemu operacyjnego, a od bieżącego CLR istnieje zgodność jeden-do-jednego z wątkami zarządzanymi i wątkami systemu operacyjnego. Jest to jednak szczegół implementacji, który może ulec zmianie w przyszłości.Identyfikator wyświetlany przez Visual Studio jest w rzeczywistości identyfikatorem wątku systemu operacyjnego. To nie jest to samo, co identyfikator zarządzanego wątku, jak sugeruje kilka odpowiedzi.
Ten
Thread
typ zawiera prywatne pole członka o nazwie IntPtrDONT_USE_InternalThread
, które wskazuje na podstawową strukturę systemu operacyjnego. Ponieważ jest to tak naprawdę szczegół wdrożenia, nie jest wskazane, aby dążyć do tego IMO. A nazwa wskazuje, że nie powinieneś na tym polegać.źródło
Możesz użyć Thread.GetHashCode, który zwraca identyfikator zarządzanego wątku. Jeśli myślisz o celu GetHashCode, ma to sens - musi to być unikalny identyfikator (np. Klucz w słowniku) dla obiektu (wątku).
Źródło odniesienia dla klasy Thread jest pouczające tutaj. (Oczywiście, konkretna implementacja .NET może nie być oparta na tym kodzie źródłowym, ale dla celów debugowania zaryzykuję.)
GetHashCode „zapewnia ten kod skrótu dla algorytmów, które wymagają szybkiej kontroli równości obiektu”, więc dobrze nadaje się do sprawdzania równości wątków - na przykład w celu zapewnienia, że określona metoda wykonuje się w wątku, z którego ma zostać wywołana.
źródło