2009-11-17 23 views
7

समय-समय पर हमें उत्पादन वातावरण में विंडोज सेवा को बंद करने पर लटका मिलता है जिसे हम पुन: पेश नहीं कर सकते हैं। यह फिर से होने से पहले महीने हो सकता है।प्रोसेस थ्रेड से एक प्रबंधित थ्रेड पर प्राप्त करना

मैं इस मुद्दे के साथ प्रयास करने और मदद करने के लिए कुछ निदान में डाल रहा हूं, एक चीज जिसे मैं देख रहा हूं, एप्लिकेशन के बंद होने के 60 मिनट बाद सिस्टम थ्रेड पूल में एक ईवेंट जोड़ रहा है। हमारे आवेदन को 10 सेकंड अधिकतम के भीतर साफ रूप से बंद करना चाहिए।

इस घटना में मैं प्रक्रिया लॉग के लिए प्रक्रिया के शेष चल रहे धागे का पता लगाने के लिए चाहता हूं।

मैं System.Diagnostics.Process.GetCurrentProcess.Threads का उपयोग कर चल रहे थ्रेड प्राप्त कर सकता हूं। इन थ्रेड ऑब्जेक्ट्स में देशी Win32 थ्रेड आईडी आदि हैं

मैं सोच रहा था कि क्या इन थ्रेड आईडी से किसी भी प्रबंधित थ्रेड से वापस आने का कोई तरीका था जो वे वर्तमान प्रक्रिया में प्रतिनिधित्व करते हैं। कारण मैं ऐसा करने की कोशिश कर रहा हूं क्योंकि हमारे थ्रेड पूल और अन्य थ्रेडों के लिए हम उन नामों को देते हैं जो उनके उद्देश्य का प्रतिनिधित्व करते हैं और यह वास्तव में इन्हें वापस पाने में मदद करेगा।

+0

कभी पता चल गया है किसी को भी कैसे, 3 साल बाद यह करने के लिए? –

+0

हाय ब्रूनो, यह मूल रूप से संभव नहीं है। – Bigtoe

+1

आपने थ्रेड पूल में धागे को नाम कैसे निर्दिष्ट किए? आईएमएचओ यह संभव नहीं है। –

उत्तर

11

निम्नलिखित कारणों से यह असंभव है। Quote from MSDN:

एक ऑपरेटिंग सिस्टम threadid एक प्रबंधित धागा करने के लिए कोई तय संबंध नहीं है, क्योंकि एक अप्रबंधित मेजबान प्रबंधित और अप्रबंधित धागे बीच संबंध को नियंत्रित कर सकते हैं। विशेष रूप से, एक परिष्कृत मेजबान CLR होस्टिंग एपीआई एक ही ऑपरेटिंग सिस्टम धागा के खिलाफ कई कामयाब धागे शेड्यूल करने के लिए उपयोग कर सकते हैं, या अलग ऑपरेटिंग सिस्टम धागे के बीच एक कामयाब धागा ले जाने के लिए।

तो प्रबंधित धागे और ओएस धागे के बीच कोई भी एक मैपिंग नहीं है।

तो अब प्रश्न बन जाता है, वर्तमान में वर्तमान प्रक्रिया में चल रहे सभी प्रबंधित धागे की सूची कैसे प्राप्त करें? दुर्भाग्य से मुझे जवाब नहीं पता है।

+0

धन्यवाद डारिन। मैं अपने आप को वेब पर पढ़ने से निष्कर्ष निकाला था। किसी को उम्मीद थी कि वहां इस मुद्दे पर फेंकने के लिए थोड़ा सा जादू हो सकता है जो चाल चल सकता है।मैं वर्तमान में उन सभी अप्रबंधित थ्रेड जानकारी का पता लगा रहा हूं जिन पर मैं अपना हाथ ले सकता हूं। निर्माण समय पर सभी प्रबंधित धागे के लिए समान जानकारी डालने पर विचार करेगा जहां मुझे उस कार्यक्षमता तक पहुंच होगी। उम्मीद है कि मैं उनके बीच कुछ सहसंबंध प्राप्त करूंगा। – Bigtoe

+1

"वर्तमान में मौजूदा प्रक्रिया में चल रहे सभी प्रबंधित धागे की सूची कैसे प्राप्त करें" - एक डीबगर के साथ संभव है, उदा। WinDbg + SOS ('! Threads') –

+0

[एक समान समस्या और उत्तर दिखाता है कि प्रबंधित धागे को कैसे सूचीबद्ध करें और उनके स्टैकट्रैस के माध्यम से खोजें] (http://stackoverflow.com/a/35558240/717732) – quetzalcoatl

0

ऐसा लगता है कि यह संभव नहीं है।
सौभाग्य से हमारे लिए हमारे पास अपनी खुद की थ्रेडिंग लाइब्रेरीज़ हैं जो .NET पुस्तकालयों को लपेटती हैं और मैं उन सक्रिय निदानों की सूची रखने के लिए कार्यक्षमता डाल सकता हूं जिन्हें हम इन निदान के लिए उपयोग कर सकते हैं।
यह काफी अच्छी तरह से काम करता है लेकिन पाठ्यक्रम में शामिल प्रयास और परीक्षण का एक उचित प्रयास था, लेकिन उम्मीद है कि हम इसके नीचे पाएंगे।

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