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

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

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


当前回答

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

其他回答

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

System.Threading.Thread.CurrentThread.Name

System.Threading.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()

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