2009-09-04 16 views
71

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

कि के प्रकाश में, मैं के बाद से मेरा आधार नियंत्रक लिए यह परिवर्तन किया है:

public class MyBaseController : Controller 
{ 
    private ConfigurationManager configManager; // Manages the data context. 

    public MyBaseController() 
    { 
     configManager = new ConfigurationManager(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (this.configManager != null) 
      { 
       this.configManager.Dispose(); 
       this.configManager = null; 
      } 
     } 

     base.Dispose(disposing); 
    } 
} 

अब, मैं दो प्रश्न हैं:

  1. मैं एक रेस स्थिति को शुरू कर रहा हूँ?configManager के बाद से DataContext कि विचारों को IQueryable<> मापदंडों को उजागर करता है, मुझे यकीन है कि Dispose() से पहले दृश्य प्रतिपादन समाप्त होने नियंत्रक पर नहीं कहा जा जाएगा बनाने की जरूरत का प्रबंधन करता है।
  2. पहले या बाद में दृश्य प्रदान की गई है नियंत्रक पर MVC ढांचे कॉल Dispose() करता है? या, MVC रूपरेखा है कि GarbageCollector अप करने के लिए कितने बजे है?
+1

मैं sooo इस एक का जवाब करने के लिए तत्पर lookig हूँ! महान सवाल! –

+0

अन्य कोड (आपका या एएसपी.नेट एमवीसी ..) को देखे बिना) आपको configManager को ठीक करने की ज़रूरत क्यों है? क्या इससे कुछ मदद मिलती है? आप में से किसी भी "डीयूएच" से पहले पूरी तरह से सोचें .. –

+0

मेरा मतलब है कि एक सामान्य मामले में कि दौड़ की स्थिति को आसानी से हटाया जा सकता है। इस विशेष मामले में मुझे संदेह है कि एक नियंत्रक उदाहरण का उपयोग एक से अधिक धागे द्वारा किया जाएगा और इसलिए दौड़ की स्थिति का कोई खतरा नहीं है। –

उत्तर

60

के बाद दृश्य प्रदान की गई है निपटान कहा जाता है, हमेशा

दृश्य ActionResult.ExecuteResult करने के लिए कॉल में प्रदान की गई है। इसे 0 अप्रत्यक्ष रूप से ControllerActionInvoker.InvokeAction कहा जाता है, जिसे बदले में ControllerBase.ExecuteCore कहा जाता है।

के बाद नियंत्रक कॉल स्टैक में है जब दृश्य प्रदान की गई है, यह तो निपटारा नहीं किया जा सकता।

+0

बढ़िया, क्या आपके पास दस्तावेज है? मैं बस सुनिश्चित करना चाहता हूँ। –

+0

दस्तावेज़ीकरण एमवीसी स्रोत कोड है। विस्तारित उत्तर देखें। –

+0

बिल्कुल सही। धन्यवाद! –

32

बस Craig Stuntz's Answer पर विस्तार करने के लिए:

ControllerFactory संभालती है जब एक नियंत्रक निपटान किया जाता है। IControllerFactory इंटरफेस को कार्यान्वित करते समय, कार्यान्वित करने की आवश्यकता वाले तरीकों में से एक रिलीज नियंत्रक है।

मुझे यकीन है कि क्या ControllerFactory आप उपयोग कर रहे हैं, चाहे आप अपने खुद के लुढ़का नहीं हूँ, लेकिन परावर्तक में DefaultControllerFactory को देख, ReleaseController विधि इतनी तरह कार्यान्वित किया जाता है:

public virtual void ReleaseController(IController controller) 
{ 
    IDisposable disposable = controller as IDisposable; 
    if (disposable != null) 
    { 
     disposable.Dispose(); 
    } 
} 

एक IController संदर्भ में पारित हो जाता है, यदि वह नियंत्रक IDISposable लागू करता है, तो उस नियंत्रक निपटान विधि को बुलाया जाता है। इसलिए, यदि आपके पास कुछ भी है, तो अनुरोध समाप्त होने के बाद आपको निपटान की आवश्यकता है, जो दृश्य के बाद किया जाता है। IDISposable को बंद करें और किसी भी संसाधन को जारी करने के लिए निपटान विधि में अपना तर्क डालें।

ReleaseController विधि System.Web.Mvc.MvcHandler जो अनुरोध हैंडल द्वारा कहा जाता है और यह IHttpHandler लागू करता है। ProcessRequest HttpContext यह करने के लिए दिया लेता है और कार्यान्वित ControllerFactory में फोन करके, अनुरोध को पूरा करने नियंत्रक खोजने की प्रक्रिया शुरू होता है। यदि आप ProcessRequest विधि में देखते हैं तो आपको अंततः ब्लॉक दिखाई देगा जो नियंत्रक फैक्टरी के रिलीज नियंत्रक को कॉल करता है। यह केवल तब कहा जाता है जब नियंत्रक ने ViewResult वापस कर दिया है।

+0

बहुत बढ़िया जवाब। मुझे पता नहीं लगा कि नियंत्रक ऑब्जेक्ट का प्रत्यक्ष उदाहरण मुझे इस पर निपटान() कहने नहीं देगा, लेकिन ऐसा लगता है कि मुझे IDISposable इंटरफ़ेस का उपयोग करके इसका एक नया उदाहरण बनाना होगा। यह मेरे लिए काम किया! –

+0

तो ... 'HttpContext' एक पुरुष है? अब मैं वास्तव में उलझन में हूँ। –

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