作为一个练习,我正在编写一些代码来显示进程内的O/S进程和O/S线程(如Sysinternals进程管理器)。如何以CLR“友好”方式获得_real_线程ID?
我发现.net的ManagedThreadId(s)不是O/S线程标识符。读了一下之后,我发现AppDomain.GetCurrentThreadId()。不幸的是,该功能被标记为“过时”(这可能意味着未来“不可用”)。我找到的一个解决方案是使用InteropServices直接调用Win32 GetCurrentThreadId。我对此感觉很好,但它与.net哲学相反。
我的问题是:是否有CLR“友好”的方式获得当前线程的真实ID?
仅供参考,以下是代码片段,展示了迄今为止我所尝试的内容。 // 1和// 2显示正确的线程ID,// 3和// 4尝试以CLR友好的方式获取相同的信息(但它们不起作用)。
谢谢你的帮助,
John。
[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);
}
为什么要CLR“友好”的方式来获得一段CLR“不友好”的数据,在这个数据上只能执行CLR的“不友好”操作? – Polity 2011-04-11 16:07:34
@Polity:我编写的系统实用程序,其中大部分与.net无关。如果我用.net编程,即使我感兴趣的信息与.net环境无关,我也希望对.net“友好”。 – Hex440bx 2011-04-11 16:14:19
那么,我的观点仍然有效:)没有理由用钢制造汽车的一部分,而用木头制造另一部分汽车。就像没有理由得到一个本地的threadID我只是一个.NET友好的方式,只用它与本地系统API的。在这种情况下使用win32的GetCurrentThreadId是完全有效的! – Polity 2011-04-11 16:29:48