2010-03-15 6 views
5

मेरे पास मेरे एप्लिकेशन में एक थ्रेड है जो कोड चला रहा है जो संभावित रूप से कॉल स्टैक भ्रष्टाचार का कारण बन सकता है (मेरा एप्लिकेशन डीएलएस के लिए एक परीक्षण उपकरण है)।मैं एक .NET थ्रेड को कैसे समाप्त कर सकता हूं जिसकी कॉल स्टैक दूषित हो गई है?

मान लीजिए कि मेरे पास यह पता लगाने का तरीका है कि क्या बच्चा धागा गलत व्यवहार कर रहा है, मैं इसे कैसे समाप्त करूं? जो मैंने पढ़ा है, उससे थ्रेड.एबॉर्ट() को गलत व्यवहार करने वाले थ्रेड पर कॉल करना इसके अंदर एक अपवाद बढ़ाने के बराबर होगा। मुझे डर है कि यह एक अच्छा विचार नहीं है, बशर्ते थ्रेड का कॉल स्टैक दूषित हो। कोई सुझाव?

+0

आपको कोड को फिर से लिखना होगा क्योंकि ऐसा कभी नहीं होना चाहिए। – ChaosPandion

+1

जैसा कि मैंने कहा था, मैं एक परीक्षण उपकरण बनाने की कोशिश कर रहा हूं, इसलिए मुझे यह मानना ​​चाहिए कि परीक्षण करने वाला कोई भी डीएलएल कार्य संभावित रूप से खतरनाक है। –

+1

एक बार फिर मेरी पढ़ने की समझ ने मुझे असफल कर दिया है। मैं क्षमाप्रार्थी हूं। – ChaosPandion

उत्तर

6

यदि आप अविश्वसनीय कोड चला रहे हैं जो आपकी प्रक्रिया को दूषित कर सकता है तो उस कोड को एक अलग प्रक्रिया में चलाएं और इंटरप्रोसेस संचार का उपयोग करके इसके साथ संवाद करें। यदि आप अविश्वसनीय कोड को जल्दी से समाप्त करना चाहते हैं, तो आप केवल प्रक्रिया को मार सकते हैं।

+1

अचानक मेरे पास उस मंजी गीत "किल डैश नौ" मेरे सिर में फंस गया है। –

+0

http://www.monzy.com/intro/killdashnine_lyrics.html –

3

यदि कोड गलत व्यवहार कर रहा है, तो यह कुछ भी कर सकता है, और यह किसी भी थ्रेड पर पूरी प्रक्रिया में कुछ भी प्रभावित कर सकता है।

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

+0

हमेशा हत्या करना। इसे अपने धागे पर चलाना केवल जोखिम भरा और अविश्वसनीय होगा, संभव अविश्वसनीय फाइनलरों के लिए धन्यवाद जो कुछ भी कर सकते हैं ... – luckyluke

3

लोड एक नया AppDomain में DLL और वहाँ AppDomain.DoCallBack विधि का उपयोग करने से DLL में कोड चलाते हैं।

0

स्वीकार्य उत्तर के अतिरिक्त, मैं यह जोड़ना चाहता हूं कि थ्रेड को अनदेखा करना मुश्किल है। ऑबॉर्ट।

try 
{ 
    ... 
} 
catch (ThreadAbortException) 
{ 
    Thread.ResetAbort(); 
} 
संबंधित मुद्दे