I'm going through a big refactoring / speed tweaking of one of my larger MVC apps. It has been deployed to production for a few months now, and I was starting to get timeouts waiting for connections in the connection pool. I have tracked the issue down to the connections not getting disposed properly.
In light of that, I have since made this change to my base controller:
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);
}
}
Now, I have two questions:
- Am I introducing a race condition? Since the
configManager
manages theDataContext
that exposesIQueryable<>
parameters to the views, I need to make sure thatDispose()
will not be called on the controller before the view finishes rendering. - Does the MVC framework call
Dispose()
on the Controller before or after the view is rendered? Or, does the MVC framework leave that up to the GarbageCollector?