2010-05-06 12 views
12

पर कॉल को छोड़ दें मेरे पास एक फ़ंक्शन के साथ एक अप्रबंधित DLL है जो इनपुट पैरामीटर एक बड़ा मान है, कभी-कभी वांछनीय है लेकिन हमेशा नहीं, एक लंबे समय तक चल सकता है।अप्रबंधित DLL

मैं इस फ़ंक्शन को कैसे कॉल कर सकता हूं ताकि जब आवश्यक हो तो मैं इसे निरस्त कर सकता हूं?

अभी तक मैंने कॉल को एक अलग धागे में डालने की कोशिश की है, लेकिन न तो बाधा डालने तक प्रक्रिया को रोकने के लिए बाधा उत्पन्न होती है और न ही निरस्त होती है।

क्या चल रहे डीएलएल कोड को समाप्त करना संभव है?

उत्तर

23

अप्रबंधित कोड केवल "अपरिवर्तनीय प्रतीक्षा स्थिति" है, तो यह केवल अपरिवर्तनीय है। यह तब नहीं होगा जब यह 100% सीपीयू चक्र जल रहा हो। P/Invoking TerminateThread काम करेगा, यह मानते हुए कि आप थ्रेड हैंडल प्राप्त कर सकते हैं, जो .NET बहुत मुश्किल बनाता है। यह वैसे भी मदद नहीं करेगा, आप धागे के ढेर को रिसाव करेंगे। एक मेगाबाइट पर, आप जल्दी से वर्चुअल मेमोरी से बाहर हो जाएंगे। भले ही यह कभी-कभी कभी-कभी आवश्यकता हो, फिर भी आप बड़ी समस्याओं में भाग लेने के लिए उत्तरदायी हैं क्योंकि थ्रेड ने वैश्विक कार्यक्रम स्थिति को बदल दिया है और आप इसे पुनर्स्थापित करने के बारे में नहीं जानते हैं।

अप्रबंधित कोड को रद्द करने का एकमात्र अच्छा तरीका इसे एक अलग प्रक्रिया में चलाने के लिए है और इसे प्रोसेस.किल() के साथ सिर में शूट करना है। ऑपरेटिंग सिस्टम शर्पनेल को साफ करेगा। आपको डीएलएल के लिए एक छोटा होस्टिंग प्रोग्राम लिखना होगा और उससे बात करने के लिए प्रक्रिया इंटरऑप सुविधाओं में से एक का उपयोग करना होगा। सॉकेट, नामित पाइप, .NET रिमोटिंग, डब्ल्यूसीएफ, अपना चयन करें।

+4

+1 हेड-शॉट का उल्लेख करने के लिए;) – Nate

+1

एक और विकल्प एक अलग ऐप डोमेन में ऐसा करना है। –

+1

नहीं, ऐपडोमेन का मतलब अप्रबंधित कोड के लिए कुछ भी नहीं है। –

4

MSDN

से बीच में बंद करें प्रबंधित धागा पर कहा जाता है, जबकि यह अप्रबंधित कोड निष्पादित हो रहा है, एक ThreadAbortException कामयाब कोड के लिए धागा रिटर्न जब तक फेंक नहीं है।

तो ऐसा लगता है कि प्रबंधित धागे को निरस्त करना संभव नहीं है।
एक विकल्प के रूप में आप Win32 APIs CreateThread(), WaitForSingleObject() और TerminateThread() के साथ एक अप्रबंधित धागा शुरू करने का प्रयास कर सकते हैं। here से हस्ताक्षर का उपयोग करें।

मैंने इसे स्वयं नहीं किया, लेकिन यह निश्चित रूप से कुछ जोखिम पेश करता है, क्योंकि आप निर्धारित नहीं कर सकते कि निष्पादन के किस बिंदु पर आप धागे को मार रहे हैं। यह संसाधन रिसाव भी हो सकता है। एमएसडीएन TerminateThread() संदर्भ पर कुछ साइड इफेक्ट्स सूचीबद्ध करता है।

सामान्य रूप से मैं इस तरह के बाधा के खिलाफ सलाह दूंगा। शायद आपके पास एक अप्रत्याशित गर्भपात की अनुमति देने के लिए अप्रबंधित डीएलएल को बदलने की संभावना है।