例如,在c#中调试线程时,你可以看到每个线程的ID。
我无法找到一种方法以编程方式获得相同的线程。我甚至无法获得当前线程的ID(在thread . currentthread的属性中)。
所以,我想知道Visual Studio如何获得线程的id,是否有一种方法来获得id 2345的线程句柄,例如?
例如,在c#中调试线程时,你可以看到每个线程的ID。
我无法找到一种方法以编程方式获得相同的线程。我甚至无法获得当前线程的ID(在thread . currentthread的属性中)。
所以,我想知道Visual Studio如何获得线程的id,是否有一种方法来获得id 2345的线程句柄,例如?
当前回答
System.Threading.Thread.CurrentThread.Name
System.Threading.Thread.CurrentThread.ManagedThreadId
其他回答
获取操作系统ID使用:
AppDomain.GetCurrentThreadId()
从托管代码中,您可以访问每个托管线程的Thread类型实例。线程封装了操作系统线程的概念,在当前的CLR中,托管线程和操作系统线程是一一对应的。然而,这是一个实现细节,将来可能会改变。
Visual Studio显示的ID实际上是操作系统线程ID。这与几个回复所建议的托管线程ID不同。
Thread类型包含一个名为DONT_USE_InternalThread的私有IntPtr成员字段,它指向底层的OS结构。然而,由于这实际上是一个实现细节,因此不建议继续执行这个IMO。这个名字暗示了你不应该依赖它。
System.Threading.Thread.CurrentThread.Name
System.Threading.Thread.CurrentThread.ManagedThreadId
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;
}
例如,在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和Thread之间也没有关系,因此通过其Id获取托管线程非常困难。
有关托管线程与非托管线程的更多详细信息,请参阅这篇MSDN文章。