例如,在c#中调试线程时,你可以看到每个线程的ID。
我无法找到一种方法以编程方式获得相同的线程。我甚至无法获得当前线程的ID(在thread . currentthread的属性中)。
所以,我想知道Visual Studio如何获得线程的id,是否有一种方法来获得id 2345的线程句柄,例如?
例如,在c#中调试线程时,你可以看到每个线程的ID。
我无法找到一种方法以编程方式获得相同的线程。我甚至无法获得当前线程的ID(在thread . currentthread的属性中)。
所以,我想知道Visual Studio如何获得线程的id,是否有一种方法来获得id 2345的线程句柄,例如?
当前回答
GetThreadId返回给定本机线程的ID。有很多方法可以让它与托管线程一起工作,我相信,你只需要找到线程句柄并将它传递给那个函数。
对于托管线程,使用System.Environment.CurrentManagedThreadId。
下面包含的较旧的SDK选项存在,但是首选使用System.Environment.CurrentManagedThreadId。
GetCurrentThreadId返回当前线程ID。GetCurrentThreadId从。net 2.0开始已弃用。 thread . currentthread . managedthreadid返回当前托管线程的唯一标识符,与System.Environment.CurrentManagedThreadId相同,但是System.Environment.CurrentManagedThreadId是首选的(CA1840)。
其他回答
从2022年7月起,VS2022 IDE建议使用System.Environment.CurrentManagedThreadId而不是Thread.CurrentThread.ManagedThreadId
引用自https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1840:
System.Environment.CurrentManagedThreadId是Thread.CurrentThread.ManagedThreadId模式的紧凑而高效的替代。
查找当前线程Id使用- ' thread . currentthread . managedthreadid '。 但在这种情况下,你可能需要当前的win32线程id -使用pInvoke函数来获得它:
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
首先,您需要保存托管线程id和win32线程id连接—使用字典将win32 id映射到托管线程。
然后使用process . getcurrentprocess()遍历进程的线程,通过线程的id找到线程。线程,并找到具有该id的线程:
foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
var managedThread = win32ToManagedThread[thread.id];
if((managedThread.ManagedThreadId == threadId)
{
return managedThread;
}
}
获取操作系统ID使用:
AppDomain.GetCurrentThreadId()
从托管代码中,您可以访问每个托管线程的Thread类型实例。线程封装了操作系统线程的概念,在当前的CLR中,托管线程和操作系统线程是一一对应的。然而,这是一个实现细节,将来可能会改变。
Visual Studio显示的ID实际上是操作系统线程ID。这与几个回复所建议的托管线程ID不同。
Thread类型包含一个名为DONT_USE_InternalThread的私有IntPtr成员字段,它指向底层的OS结构。然而,由于这实际上是一个实现细节,因此不建议继续执行这个IMO。这个名字暗示了你不应该依赖它。
对于那些想要入侵的人:
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;
}