एक अभ्यास के रूप में मैं एक प्रक्रिया के भीतर ओ/एस प्रक्रियाओं और ओ/एस धागे को प्रदर्शित करने के लिए कुछ कोड लिख रहा था (जैसे 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);
}
सीएलआर "असभ्य" डेटा का एक टुकड़ा पाने के लिए आप सीएलआर "फ्रेंडली" तरीका क्यों चाहते हैं जिस पर आप केवल सीएलआर "असभ्य" संचालन निष्पादित कर सकते हैं? – Polity
@ नीति: मैं सिस्टम उपयोगिताएं लिखता हूं और उनमें से अधिकांश के पास .NET के साथ कुछ लेना देना नहीं है। यदि मैं .NET में प्रोग्राम करता हूं, तो मैं .NET के लिए "दोस्ताना" होना चाहता हूं, भले ही मुझे जिस जानकारी में दिलचस्पी है वह .NET पर्यावरण से संबंधित नहीं है। – Hex440bx
ठीक है, मेरा बिंदु वैध रहता है :) स्टील से कार और दूसरे हिस्से से लकड़ी का हिस्सा बनाने का कोई कारण नहीं है। जैसे देशी मूल आईडीआईडी प्राप्त करने का कोई कारण नहीं है, मैं केवल नेट सिस्टम एपीआई के साथ इसका उपयोग करने के लिए एक .NET अनुकूल तरीका है। Win32 के GetCurrentThreadId का उपयोग इस मामले में पूरी तरह से मान्य है! – Polity