2010-10-31 9 views
6

तो अब तक कहानी है, मेरे पास यह कार्यकर्ता चीज है जो कुछ कार्य करने के लिए ऐपडोमेन का उपयोग करती है। डोमेन सेटअप और टियरडाउन के लिए महंगा है। इसलिए मैं बनाने के एक कैश प्रति-धागा कार्यकर्ता को WeakReference वस्तुओं की thingy तो जैसे:AppDomain.Uloadload Finalizer में फेंकता है?

class Worker 
{ 
    [ThreadStatic] 
    static Dictionary<string, WeakReference> _workers; 

    public static Worker Fetch(...) { you get the idea } 

    private AppDomain _domain; 
    public Worker(...) 
    { 
     _domain = AppDomain.Create(...); 
    } 

    ~Worker() 
    { 
     AppDomain.Unload(_domain); 
    } 

    // bla bla bla 
} 

समस्या मैं आ रही हैं कि हमेशा AppDomain.Unload करने के लिए कॉल में एक अपवाद फेंक जब जीसी एकत्र करता है लगता है:

System.CannotUnloadAppDomainException: Error while unloading appdomain. (Exception from HRESULT: 0x80131015)" 

तो मैं सोच रहा हूं कि यह डरावना है, मुझे पता है कि मेरे पास उस डोमेन में कुछ भी नहीं चल रहा है ... क्या सौदा है? खुदाई और परीक्षण और त्रुटि के एक बिट मैं इस के साथ आया था:

~Worker() 
    { 
     new Action<AppDomain>(AppDomain.Unload) 
      .BeginInvoke(_domain, null, null); 
    } 

तो मेरी प्रश्न हैं:

  1. विल AppDomain.Unload हमेशा एक finalizer से असफल? क्यूं कर?
  2. क्या मैं उपर्युक्त कामकाज के साथ 'अवांछनीय' अनुभव करने जा रहा हूं?
+0

संभावित डुप्लिकेट [क्यों AppDomain.Unload() फाइनल में त्रुटि क्यों है?] (Https://stackoverflow.com/questions/1891480/why-does-appdomain-unload-error-in-finalizer) – Fabian

उत्तर

10

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

डेडलॉक।

आपका कामकाज वास्तव में उस डेडलॉक को हल करता है। फाइनल पर भरोसा करने के बजाय स्पष्ट रूप से अनलोडिंग करना बेहतर तरीका है।

+0

आह, जैसा मुझे संदेह था। सहमत हैं कि स्पष्ट अनलोड बेहतर होगा; हालांकि, मेरे पास ऐसी जगह नहीं है जहां से मैं कैश किए गए डोमेन को अनलोड कर सकूं। वीक रेफरेंस का यही कारण था। –

+0

हमने प्रोजेक्ट को .NET 4 में अपग्रेड करने के बाद इसे अभी शुरू करना शुरू कर दिया है। 3.5 एसपी 1 में हमारे लिए यह व्यवहार प्रतीत नहीं होता है। मैं इस जवाब में तर्क को समझ सकता हूं हालांकि हमारे टूटे हुए कोड को ठीक करने में मुझे खुशी है। – nbevans

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