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

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

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


当前回答

获取操作系统ID使用:

AppDomain.GetCurrentThreadId()

其他回答

System.Threading.Thread.CurrentThread.Name

System.Threading.Thread.CurrentThread.ManagedThreadId

获取操作系统ID使用:

AppDomain.GetCurrentThreadId()

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

从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模式的紧凑而高效的替代。