2011-06-23 25 views
6

बहुविध संसाधनों (उदाहरण के लिए, एमएसडीएन और सीएलआर के माध्यम से सी #) के अनुसार, जब हम AppDomain.Unload (userDomain) को कॉल करते हैं, तो उपयोगकर्ता में थ्रेड को थ्रेडएबॉर्ट अपवाद को फेंकने के लिए मजबूर किया जाएगा, जिसे बिना छेड़छाड़ नहीं किया जा सकता है जिसे हम थ्रेड कहते हैं। रीसेट एबॉर्ट। इसलिए मैंने नीचे दिए गए कोड को मेरे अंडरेंडिंग की गवाही देने की कोशिश की। एक धागा, डिफ़ॉल्ट डोमेन में बनाए गए, जो किसी अन्य डोमेन में बनाई गई है FooType की वस्तु invokefoo नीचे दिए गए कोड चलाता है (यानी, उपयोगकर्ता डोमेन)AppDomain.Unload() थ्रेड को कैसे रोकता है?

void ThreadRun(object o) 
    {  
      try 
      { 
       // this call will cross the App domain; 
       foo.Run(); 
      } 
      catch (AppDomainUnloadedException EXP) 
      {      
       Console.WriteLine("Get appdomain unload exception"); 
      } 
      catch (ThreadAbortException EXP) 
      {      
       Console.WriteLine("Get threadAbortException in ThreadRun"); 
      } 
      Console.WriteLine("Strange, this thread is still alive"); 
    } 

Foo.Run कोड नीचे दिया गया है (यह लेकिन कुछ नहीं करता है बस सो)

public class FooType : MarshalByRefObject { 
    public void Run() 
    { 
    try 
    { 
     Console.WriteLine("Foo.Run is running at " + Thread.GetDomain().FriendlyName); 
     Thread.Sleep(TimeSpan.FromSeconds(1500)); 
    } 
    catch (ThreadAbortException) 
    { 
     Console.WriteLine("get thread abort exception"); 
    } 
    } 
} 

मैं UserDomain अनलोड करने की कोशिश की है, मैं हैरान था कि ThreadAbortException केवल FooType में पकड़ा गया था रन() (जो UserDomain में है), लेकिन ThreadRun में नहीं() विधि (जो डिफ़ॉल्ट में है Domain)। और ThreadRun() केवल AppDomainUnlo adException प्राप्त करते हैं और फिर चलते रहते हैं।

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

मुझे आश्चर्य है कि क्या यह अंतर खुश होना चाहिए? बहुत बहुत धन्यवाद

+0

हो सकता है कि जब आप 'userDomain' को छोड़ दें, तो' डिफ़ॉल्ट डोमेन 'को एक लपेटा हुआ अपवाद प्राप्त हो सकता है (और' थ्रेडएबॉर्ट अपवाद 'के आंतरिक अपवाद को प्राप्त करने के बजाय।' पकड़ (अपवाद पूर्व) 'का उपयोग करने का प्रयास करें और जांच करें कि कोई अलग अपवाद फेंक दिया गया है या नहीं और यह 'इनर एक्सेप्शन' क्या है। मुझे लगता है कि उस मामले में 'AppDomainUnloadedException' फेंक दिया जाएगा। –

उत्तर

1

जब आप userDomain को उतारते हैं, तो उस डोमेन में वर्तमान में काम कर रहे थ्रेड को AbortException मिलता है। हालांकि, वही धागा एक और ऐपडोमेन भी "मुख्य" है। ऐपडोमेन को डेटा विभाजक के रूप में रखने के लिए, लेकिन निष्पादन विभाजक नहीं, सीएलआर कई ऐपडोमेन को उत्पन्न करने वाले थ्रेड को रोक नहीं सकता है। यही कारण है कि आप केवल UnloadedException प्राप्त करेंगे।

जब आप थ्रेड को कॉल करते हैं। एबॉर्ट - आप स्पष्ट रूप से एक थ्रेड के निष्पादन को निरस्त कर रहे हैं, ऐप्पडोमेन के संबंध में यह वर्तमान में है।

वैसे भी, आप नहीं चाहते हैं कि आपका थ्रेड निरस्त हो जाए, जब आप कुछ ऐपडोमेन को अनलोड करना चाहते हैं।

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