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

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

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


当前回答

根据MSDN:

一个操作系统ThreadId没有 与托管的固定关系 线程,因为非托管主机可以 控制之间的关系 托管和非托管线程。 具体来说,一个复杂的主机可以 使用CLR托管API来调度 许多托管线程针对同一个线程 操作系统线程,或移动一个 不同线程之间的托管线程 操作系统线程。

所以基本上,Thread对象并不一定对应于OS线程——这就是为什么它没有暴露本机ID的原因。

其他回答

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

例如,在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文章。

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

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

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

System.Threading.Thread.CurrentThread.Name

System.Threading.Thread.CurrentThread.ManagedThreadId