2011-04-11 15 views
7

एक अभ्यास के रूप में मैं एक प्रक्रिया के भीतर ओ/एस प्रक्रियाओं और ओ/एस धागे को प्रदर्शित करने के लिए कुछ कोड लिख रहा था (जैसे Sysinternals प्रक्रिया एक्सप्लोरर करता है)।मैं सीएलआर "दोस्ताना" तरीके से _real_ थ्रेड आईडी कैसे प्राप्त करूं?

मैंने पाया कि .NET के प्रबंधित थ्रेड आईडी ओ/एस थ्रेड आईडी नहीं हैं। कुछ पढ़ने के बाद मैं AppDomain.GetCurrentThreadId() में आया था। दुर्भाग्यवश, उस फ़ंक्शन को "अप्रचलित" के रूप में चिह्नित किया गया है (जिसका अर्थ भविष्य में "उपलब्ध नहीं" हो सकता है)। मुझे मिला एक समाधान Win32 GetCurrentThreadId को सीधे कॉल करने के लिए इंटरऑप सर्विसेज का उपयोग करना है। मैं इसके साथ ठीक हूं लेकिन, यह नेट दर्शन के प्रति काउंटर लगता है।

मेरा प्रश्न है: क्या मौजूदा थ्रेड की वास्तविक आईडी प्राप्त करने का कोई सीएलआर "दोस्ताना" तरीका है?

संदर्भ के लिए, यहां कोड का एक स्निपेट दिखा रहा है जो मैंने अभी तक कोशिश की है। // 1 और // 2 सही थ्रेड आईडी प्रदर्शित करते हैं, // 3 और // 4 एक सीएलआर अनुकूल तरीके से एक ही जानकारी प्राप्त करने का प्रयास कर रहे थे (लेकिन वे काम नहीं करते हैं।)

आपकी सहायता के लिए धन्यवाद ,

जॉन।

[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); 
} 
+2

सीएलआर "असभ्य" डेटा का एक टुकड़ा पाने के लिए आप सीएलआर "फ्रेंडली" तरीका क्यों चाहते हैं जिस पर आप केवल सीएलआर "असभ्य" संचालन निष्पादित कर सकते हैं? – Polity

+0

@ नीति: मैं सिस्टम उपयोगिताएं लिखता हूं और उनमें से अधिकांश के पास .NET के साथ कुछ लेना देना नहीं है। यदि मैं .NET में प्रोग्राम करता हूं, तो मैं .NET के लिए "दोस्ताना" होना चाहता हूं, भले ही मुझे जिस जानकारी में दिलचस्पी है वह .NET पर्यावरण से संबंधित नहीं है। – Hex440bx

+0

ठीक है, मेरा बिंदु वैध रहता है :) स्टील से कार और दूसरे हिस्से से लकड़ी का हिस्सा बनाने का कोई कारण नहीं है। जैसे देशी मूल आईडीआईडी ​​प्राप्त करने का कोई कारण नहीं है, मैं केवल नेट सिस्टम एपीआई के साथ इसका उपयोग करने के लिए एक .NET अनुकूल तरीका है। Win32 के GetCurrentThreadId का उपयोग इस मामले में पूरी तरह से मान्य है! – Polity

उत्तर

9

GetCurrentThreadId में PInvoking आपका सर्वश्रेष्ठ दांव है और आप सही जानकारी दे देंगे।

हालांकि मुझे आपको चेतावनी देना चाहिए, सीएलआर इस जानकारी को प्रदान नहीं करने के बहुत अच्छे कारण हैं: यह प्रबंधित कोड के लिए लगभग पूरी तरह से बेकार मूल्य है। यह एक एकल प्रबंधित थ्रेड के लिए सीएलआर परिप्रेक्ष्य से पूरी तरह से कानूनी है, जिसका जीवनकाल के दौरान कई अलग-अलग देशी धागे द्वारा समर्थित किया जाता है। इसका मतलब है कि GetCurrentThreadId का परिणाम थ्रेड के जीवनकाल के दौरान बदल सकता है (और होगा)।

कई अनुप्रयोगों में यह एक अवलोकन योग्य घटना नहीं है। यूआई एप्लिकेशन में यह वास्तव में नहीं होगा क्योंकि यह आम तौर पर एसटीए थ्रेड द्वारा समर्थित होता है जो COM इंटरॉप मुद्दों के कारण स्वैप करने के लिए कठिन (आमतौर पर भी अवैध) होता है। इतने सारे डेवलपर्स इस बारे में अनजान हैं। हालांकि मूड के नीचे एमटीए धागे को स्वैप करना बहुत आसान है जो आमतौर पर पृष्ठभूमि धागे का निष्पादन संदर्भ होता है।

+0

धन्यवाद। मुझे .net धागे और ओ/एस धागे के बीच के अंतर के बारे में पता है (यही कारण है कि मैंने Sysinternals 'प्रक्रिया एक्सप्लोरर का उल्लेख किया)। आपके उत्तर से मैं इकट्ठा करता हूं कि PInvoking के अलावा ओ/एस 'वर्तमान धागा प्राप्त करने का कोई सीएलआर तरीका नहीं है। उत्तर देने से पहले मैं अन्य सुझावों का इंतजार करूंगा। – Hex440bx

+0

@ हेक्स 440 बीएक्स मैं काफी हद तक निश्चित हूं कि प्रबंधित कोड से मूल आईडी प्राप्त करने के हर तरीके को 2.0 में बहिष्कृत किया गया था। – JaredPar

-1

यह किसी कारण से अप्रचलित है; भविष्य में विचार 'वास्तविक' थ्रेड आईडी स्थिर नहीं हो सकता है, या .NET धागे के बीच साझा किया जा सकता है।

+0

@ कियरन: मैं .NET में कुछ "कुशलतापूर्वक" करने की जानकारी नहीं जा रहा हूं, मैं इसे केवल ओ/एस स्तर पर उपयोग करूंगा (उदाहरण के लिए प्रोसेस एक्सप्लोरर करता है।) – Hex440bx

+0

विरोधाभास ऐसा लगता है कि आप वर्तमान थ्रेड आईडी की तलाश में हैं, जिसमें मेरी समस्याएं ऊपर बताई गई हैं; बिंदु एक .NET धागा आवश्यक नहीं है एक ओ/एस थ्रेड के बराबर –

+0

@ कियरन: मैं .net और O/S थ्रेड के बारे में आपकी बात समझता हूं। मैं जो कह रहा हूं वह है, अगर मैं सी # (और .net स्पष्ट रूप से) का उपयोग कर प्रोसेस एक्सप्लोरर जैसे उपयोगिता लिखना चाहता था, तो यह ओ/एस स्तर पर सटीक जानकारी प्रदान करते समय .NET दर्शन के लिए सच रह सकता है। – Hex440bx

संबंधित मुद्दे