【发布时间】:2011-04-11 16:03:03
【问题描述】:
作为练习,我正在编写一些代码来显示进程中的 O/S 进程和 O/S 线程(就像 Sysinternals 进程浏览器所做的那样)。
我发现 .net 的 ManagedThreadId(s) 不是 O/S 线程 ID。经过一番阅读,我遇到了 AppDomain.GetCurrentThreadId()。不幸的是,该功能被标记为“过时”(这可能意味着将来“不可用”)。我发现的一种解决方案是使用 InteropServices 直接调用 Win32 GetCurrentThreadId。我对此很好,但感觉与 .net 理念背道而驰。
我的问题是:有没有一种 CLR“友好”的方式来获取当前线程的真实 id?
作为参考,这里有一个 sn-p 的代码,展示了我到目前为止所做的尝试。 // 1 和 // 2 显示正确的线程 id, // 3 和 // 4 试图以 CLR 友好的方式获取相同的信息(但它们不起作用。)
谢谢你的帮助,
约翰。
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();
static void Main(string[] args)
{
// AppDomain.GetCurrentThreadId() is "obsolete"
int ThreadId1 = AppDomain.GetCurrentThreadId(); // 1
// not the ".net" way of doing things
int ThreadId2 = GetCurrentThreadId(); // 2
// "no joy" attempts to get the same results I got above
int ThreadId3 = Process.GetCurrentProcess().Threads[0].Id; // 3
int ThreadId4 = Thread.CurrentThread.ManagedThreadId; // 4
Console.WriteLine("ThreadId1: {0}, ThreadId2: {1}, ThreadId3: {2}, " +
"ThreadId4: {3}",
ThreadId1, ThreadId2, ThreadId3, ThreadId4);
}
【问题讨论】:
-
可能与 this question 重复。
-
为什么您需要一种 CLR“友好”方式来获取一条只能执行 CLR“不友好”操作的 CLR“不友好”数据?
-
@Polity:我编写系统实用程序,其中大多数与 .net 无关。如果我在 .net 中编程,我希望对 .net “友好”,即使我感兴趣的信息与 .net 环境无关。
-
好吧,我的观点仍然有效 :) 没有理由用钢制造汽车的一部分,而用木头制造另一部分。就像没有理由以 .NET 友好的方式获取本地线程 ID 一样,只能将其与本地系统 API 一起使用。在这种情况下使用 win32 的 GetCurrentThreadId 是完全有效的!