asp.net-mvc - एएसपी एमवीसी: आईकंट्रोलर कब निपटान () कहा जाता है?




1 Answers

व्यू को हमेशा प्रस्तुत किए जाने के बाद बुलाया जाता है।

दृश्य को ActionResult.ExecuteResult कॉल में प्रस्तुत किया जाता है। इसे ControllerActionInvoker.InvokeAction द्वारा (अप्रत्यक्ष रूप से) कहा जाता है, जिसे बदले में ControllerBase.ExecuteCore द्वारा बुलाया जाता है।

चूंकि दृश्य प्रस्तुत किए जाने पर नियंत्रक कॉल स्टैक में होता है, तब इसे डिस्पोजेड नहीं किया जा सकता है।

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

इसके प्रकाश में, मैंने तब से अपने मूल नियंत्रक में यह परिवर्तन किया है:

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. दृश्य के पहले या बाद में नियंत्रक पर एमवीसी फ्रेमवर्क कॉल Dispose() को प्रस्तुत किया जाता है? या, क्या एमवीसी फ्रेमवर्क कचरा कोलेक्टर तक छोड़ देता है?



Related

asp.net-mvc linq-to-sql garbage-collection idisposable