作爲一個練習,我正在編寫一些代碼來顯示進程內的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