Hey, all!
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);
}
}
Simple dispose code. Now, I have just one question:
Am I introducing a race condition?
Since the configManager
manages the DataContext
that exposes IQueryable<>
parameters to the views, I need to make sure that Dispose()
will not be called on the controller before the view finishes rendering.
So, the real question is:
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?