Estoy pasando por un gran cambio de refactorización/velocidad de una de mis aplicaciones MVC más grandes. Se ha implementado en la producción durante unos meses y estaba empezando a tener tiempos de espera esperando conexiones en el grupo de conexiones. He rastreado el problema hasta que las conexiones no se eliminan adecuadamente.ASP MVC: ¿Cuándo se llama IController Dispose()?
En vista de ello, desde entonces he hecho este cambio a mi base:
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);
}
}
Ahora, tengo dos preguntas:
- ¿Estoy introducción de una condición de carrera? Desde el
configManager
gestiona elDataContext
que exponeIQueryable<>
parámetros a los puntos de vista, que necesita para asegurarse de queDispose()
no se llamará en el controlador antes de la vista termina de renderizado. - ¿La estructura MVC llama al
Dispose()
en el controlador antes o después de que se visualice la vista? O bien, ¿el marco de MVC deja ese hasta el GarbageCollector?
¡Estoy esperando la respuesta a este! ¡GRAN pregunta! –
Sin mirar otro código (el tuyo o ASP.NET MVC ...) ¿por qué necesitas anular el configManager? ¿Eso ayuda a algo? Piensa bien antes de que alguno de ustedes "DUH" me ... –
Quiero decir en un caso general como que una condición de carrera puede eliminarse fácilmente como tal. En este caso particular, dudo que una instancia de controlador sea utilizada por más de un hilo y, por lo tanto, no hay riesgo de una condición de carrera en absoluto. –