답변:
GetThreadId
주어진 네이티브 스레드의 ID를 반환합니다. 관리되는 스레드와 작동하게하는 방법이 있습니다. 스레드 핸들 만 찾아 해당 기능에 전달해야합니다.
GetCurrentThreadId
현재 스레드의 ID를 반환합니다.
GetCurrentThreadId
.NET 2.0에서 더 이상 사용되지 않습니다. 권장되는 방법은 Thread.CurrentThread.ManagedThreadId
속성입니다.
System.Threading.Thread.CurrentThread.ManagedThreadId
에서 사용할 때 적어도 작동하지 않는 것을 알기 위해이 의견을 게시하고 싶습니다 SetWindowsHookEx
. 대신 네이티브 win32 함수에서 스레드 ID를 가져와야합니다 GetCurrentThreadId()
.
예를 들어 C #에서 스레드를 디버깅 할 때 각 스레드의 ID를 볼 수 있습니다.
관리되는 스레드의 ID가됩니다. ManagedThreadId
의 멤버 Thread
이므로 모든 Thread 객체 에서 ID를 얻을 수 있습니다 . 현재 ManagedThreadID가 표시됩니다 .
Thread.CurrentThread.ManagedThreadId
OS 스레드 ID (ManagedThreadID 아님) 로 OS 스레드를 얻으려면 약간의 linq를 시도 할 수 있습니다.
int unmanagedId = 2345;
ProcessThread myThread = (from ProcessThread entry in Process.GetCurrentProcess().Threads
where entry.Id == unmanagedId
select entry).First();
관리되는 스레드를 열거 할 수있는 방법이없고 ProcessThread와 스레드 사이의 관계가없는 것 같으므로 ID로 관리되는 스레드를 얻는 것은 어려운 일입니다.
관리 및 비 관리 스레딩에 대한 자세한 내용은 이 MSDN arcticle을 참조하십시오 .
더 이상 사용되지 않는 AppDomain.GetCurrentThreadId
것을 사용하여 현재 실행중인 스레드의 ID를 얻을 수 있습니다 . 이 메소드는 PInvoke를 Win32 API 메소드 GetCurrentThreadID
로 사용하고 Windows 스레드 ID를 리턴합니다.
이 메서드는 .NET Thread 개체가 단일 Windows 스레드에 해당하지 않으므로 Windows에서 지정된 .NET 스레드에 대해 반환 할 수있는 안정적인 ID가 없기 때문에 더 이상 사용되지 않는 것으로 표시됩니다.
이것이 더 많은 이유에 대해서는 구성 자의 답변을 참조하십시오.
OS ID를 얻으려면 다음을 사용하십시오.
AppDomain.GetCurrentThreadId()
AppDomain.GetCurrentThreadId()
사용되지 않습니다 : AppDomain.GetCurrentThreadId
관리되는 스레드가 실행 중일 때 안정된 ID를 제공하지 않기 때문에 사용되지 않습니다 fibers (aka lightweight threads)
. 관리되는 스레드의 안정적인 식별자를 얻으려면 ManagedThreadId
on 속성을 사용하십시오 Thread
. 사용법 :Thread.CurrentThread.ManagedThreadId
MSDN 에 따르면 :
관리되지 않는 호스트는 관리되는 스레드와 관리되지 않는 스레드 간의 관계를 제어 할 수 있으므로 운영 체제 ThreadId는 관리되는 스레드와 고정 된 관계가 없습니다. 특히, 정교한 호스트는 CLR 호스팅 API를 사용하여 동일한 운영 체제 스레드에 대해 많은 관리되는 스레드를 예약하거나 다른 운영 체제 스레드간에 관리되는 스레드를 이동할 수 있습니다.
따라서 기본적으로 Thread
객체는 반드시 OS 스레드와 일치하지 않아도되므로 기본 ID가 노출되지 않습니다.
해킹하려는 사람들을 위해 :
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;
}
현재 쓰레드 ID를 찾으려면`Thread.CurrentThread.ManagedThreadId '를 사용하십시오. 그러나이 경우 현재 win32 스레드 ID가 필요할 수 있습니다-pInvoke를 사용 하여이 함수로 가져 오십시오.
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
먼저 관리되는 스레드 ID와 win32 스레드 ID 연결을 저장해야합니다. win32 id를 관리되는 스레드에 매핑하는 사전을 사용하십시오.
그런 다음 ID로 스레드를 찾으려면 Process.GetCurrentProcess (). Threads를 사용하여 프로세스의 스레드를 반복하고 해당 ID의 스레드를 찾으십시오.
foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
var managedThread = win32ToManagedThread[thread.id];
if((managedThread.ManagedThreadId == threadId)
{
return managedThread;
}
}
ProcessThread
이 동일하지 않습니다, 객체 (없으며 상속하지) Thread
: (thread as Thread)
널 참조를 반환합니다.
Windows 10에서 오프셋은 0x022C (x64 비트 응용 프로그램) 및 0x0160 (x32 비트 응용 프로그램)입니다.
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;
}
관리 코드 Thread
에서 각 관리 스레드 유형의 인스턴스에 액세스 할 수 있습니다 . Thread
OS 스레드의 개념을 캡슐화하고 현재 CLR에서 관리되는 스레드 및 OS 스레드와 일대일로 대응합니다. 그러나 이것은 구현 세부 사항이며 향후 변경 될 수 있습니다.
Visual Studio에 표시되는 ID는 실제로 OS 스레드 ID입니다. 이다 없는 몇 가지 응답에 의해 제안 관리되는 스레드 ID와 동일.
이 Thread
유형에는 DONT_USE_InternalThread
기본 OS 구조를 가리키는 개인 IntPtr 구성원 필드가 포함됩니다 . 그러나 이것은 실제로 구현 세부 사항이므로이 IMO를 추구하는 것은 좋지 않습니다. 그리고 일종의 이름은 당신이 이것에 의존해서는 안된다는 것을 나타냅니다.
관리되는 스레드 ID를 반환하는 Thread.GetHashCode를 사용할 수 있습니다. GetHashCode의 목적에 대해 생각할 경우 이는 의미가 있습니다. 객체 (스레드)의 고유 식별자 (예 : 사전의 키) 여야합니다.
Thread 클래스 의 참조 소스 는 여기에 도움이됩니다. (특정 .NET 구현 은 이 소스 코드를 기반으로하지 않을 수도 있지만 디버깅 목적으로 기회를 잡을 것입니다.)
GetHashCode는 "개체 동등성을 빠르게 검사해야하는 알고리즘에이 해시 코드를 제공합니다."따라서 스레드 동등성을 검사하는 데 적합합니다.