Например, в C # при отладке потоков вы можете видеть идентификатор каждого потока.
Я не мог найти способ получить ту же нить программным способом. Я даже не смог получить идентификатор текущего потока (в свойствах Thread.currentThread
).
Итак, мне интересно, как Visual Studio получает идентификаторы потоков, и есть ли способ, например, получить дескриптор потока с идентификатором 2345
?
источник
System.Threading.Thread.CurrentThread.ManagedThreadId
он не будет работать по крайней мере при использовании вSetWindowsHookEx
. Вместо этого мы должны получить идентификатор потока из нативной функции win32GetCurrentThreadId()
.Это будут идентификаторы управляемых потоков.
ManagedThreadId
является членом,Thread
так что вы можете получить идентификатор из любого объекта потока . Это даст вам текущий ManagedThreadID :Чтобы получить поток ОС по его идентификатору потока ОС (не ManagedThreadID) , вы можете попробовать немного linq.
Кажется, что нет никакого способа перечислить управляемые потоки и нет никакой связи между ProcessThread и Thread, поэтому получить управляемый поток по его идентификатору довольно сложно.
Дополнительные сведения об управляемой и неуправляемой многопоточности см. В этой статье MSDN .
источник
Вы можете использовать устаревший,
AppDomain.GetCurrentThreadId
чтобы получить идентификатор текущего запущенного потока. Этот метод использует PInvoke для метода Win32 APIGetCurrentThreadID
и возвращает идентификатор потока Windows.Этот метод помечен как устаревший, поскольку объект потока .NET не соответствует ни одному потоку Windows, и поэтому отсутствует стабильный идентификатор, который может быть возвращен Windows для данного потока .NET.
Посмотрите ответ конфигуратора для большего количества причин, почему это так.
источник
Для получения идентификатора ОС используйте:
источник
AppDomain.GetCurrentThreadId()
устарел:AppDomain.GetCurrentThreadId
устарел, поскольку не обеспечивает стабильный идентификатор, когда запущены управляемые потокиfibers (aka lightweight threads)
. Чтобы получить стабильный идентификатор для управляемого потока, используйтеManagedThreadId
свойство onThread
. Использование:Thread.CurrentThread.ManagedThreadId
По данным MSDN :
Таким образом, по сути,
Thread
объект не обязательно соответствует потоку ОС - вот почему у него нет собственного идентификатора.источник
Для тех, кто собирается взломать:
источник
Чтобы найти текущий идентификатор потока, используйте - Thread.CurrentThread.ManagedThreadId. Но в этом случае вам может понадобиться текущий идентификатор потока win32 - используйте pInvoke, чтобы получить его с помощью этой функции:
Сначала вам нужно сохранить идентификатор управляемого потока и соединение с идентификатором потока win32 - используйте словарь, который отображает идентификатор win32 в управляемый поток.
Затем, чтобы найти поток по его идентификатору, выполните итерацию по потоку процесса с помощью Process.GetCurrentProcess (). Threads и найдите поток с этим идентификатором:
источник
ProcessThread
объектов, это не то же самое, что (и не наследует)Thread
:(thread as Thread)
возвращает нулевую ссылку.Смещение под Windows 10 составляет 0x022C (x64-bit-Application) и 0x0160 (x32-bit-Application):
источник
System.Threading.Thread.CurrentThread.Nameисточник
Из управляемого кода у вас есть доступ к экземплярам
Thread
типа для каждого управляемого потока.Thread
инкапсулирует концепцию потока ОС, и в текущем CLR существует взаимно-однозначное соответствие с управляемыми потоками и потоками ОС. Однако это деталь реализации, которая может измениться в будущем.ID, отображаемый в Visual Studio, фактически является идентификатором потока ОС. Это не то же самое, что идентификатор управляемого потока, как предлагается в нескольких ответах.
Thread
Типа действительно включает частное поле члена IntPtr под названиемDONT_USE_InternalThread
, что указывает на основную структуру OS. Тем не менее, поскольку это действительно детали реализации, не рекомендуется использовать эту IMO. И название указывает на то, что вы не должны полагаться на это.источник
Вы можете использовать Thread.GetHashCode, который возвращает идентификатор управляемого потока. Если вы думаете о назначении GetHashCode, это имеет смысл - это должен быть уникальный идентификатор (например, ключ в словаре) для объекта (потока).
Справочник для класса Thread поучительно здесь. (Конечно, конкретная реализация .NET может не основываться на этом исходном коде, но в целях отладки я рискну.)
GetHashCode «предоставляет этот хэш-код для алгоритмов, которые нуждаются в быстрой проверке равенства объектов», поэтому он хорошо подходит для проверки равенства потоков - например, чтобы утверждать, что конкретный метод выполняется в потоке, из которого вы хотели его вызвать.
источник