Ich mache gerade eine große Umgestaltung / Geschwindigkeitsoptimierung einer meiner größeren MVC-Apps durch. Es wird seit einigen Monaten in der Produktion bereitgestellt, und es kam zu Zeitüberschreitungen, die auf Verbindungen im Verbindungspool warteten. Ich habe das Problem auf die Verbindungen zurückgeführt, die nicht ordnungsgemäß entsorgt wurden.
Vor diesem Hintergrund habe ich diese Änderung an meinem Basis-Controller vorgenommen:
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);
}
}
Jetzt habe ich zwei Fragen:
- Führe ich eine Rennbedingung ein? Da das
configManager
verwaltetDataContext
, dasIQueryable<>
Parameter für die Ansichten verfügbar macht, muss ich sicherstellen, dassDispose()
diese nicht auf dem Controller aufgerufen werden, bevor die Ansicht das Rendern beendet. - Ruft das MVC-Framework
Dispose()
den Controller vor oder nach dem Rendern der Ansicht auf? Oder überlässt das MVC-Framework dies dem GarbageCollector?