例如,在c#中调试线程时,你可以看到每个线程的ID。

我无法找到一种方法以编程方式获得相同的线程。我甚至无法获得当前线程的ID(在thread . currentthread的属性中)。

所以,我想知道Visual Studio如何获得线程的id,是否有一种方法来获得id 2345的线程句柄,例如?


当前回答

您可以使用已弃用的AppDomain。GetCurrentThreadId获取当前运行线程的ID。该方法使用一个PInvoke到Win32 API方法GetCurrentThreadID,并将返回Windows线程ID。

此方法被标记为已弃用,因为. net Thread对象不对应于单个Windows线程,因此Windows无法为给定的. net线程返回稳定的ID。

关于为什么会出现这种情况的更多原因,请参阅配置器的答案。

其他回答

从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使用:

AppDomain.GetCurrentThreadId()

对于那些想要入侵的人:

    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;
    }

您可以使用已弃用的AppDomain。GetCurrentThreadId获取当前运行线程的ID。该方法使用一个PInvoke到Win32 API方法GetCurrentThreadID,并将返回Windows线程ID。

此方法被标记为已弃用,因为. net Thread对象不对应于单个Windows线程,因此Windows无法为给定的. net线程返回稳定的ID。

关于为什么会出现这种情况的更多原因,请参阅配置器的答案。

从托管代码中,您可以访问每个托管线程的Thread类型实例。线程封装了操作系统线程的概念,在当前的CLR中,托管线程和操作系统线程是一一对应的。然而,这是一个实现细节,将来可能会改变。

Visual Studio显示的ID实际上是操作系统线程ID。这与几个回复所建议的托管线程ID不同。

Thread类型包含一个名为DONT_USE_InternalThread的私有IntPtr成员字段,它指向底层的OS结构。然而,由于这实际上是一个实现细节,因此不建议继续执行这个IMO。这个名字暗示了你不应该依赖它。