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 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.
- 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?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…