Estou passando por uma grande refatoração / ajuste de velocidade de um dos meus aplicativos MVC maiores. Ele foi implantado em produção há alguns meses e eu estava começando a obter tempos limite de espera por conexões no pool de conexão. Eu rastreei o problema até as conexões não serem descartadas corretamente.
À luz disso, fiz esta alteração no meu controlador de 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);
}
}
Agora, tenho duas perguntas:
- Estou introduzindo uma condição de corrida? Como o
configManager
gerencia oDataContext
que expõe osIQueryable<>
parâmetros às visualizações, preciso ter certeza de queDispose()
não será chamado no controlador antes que a visualização termine a renderização. - A estrutura MVC chama
Dispose()
o controlador antes ou depois que a visualização é renderizada? Ou a estrutura MVC deixa isso para o GarbageCollector?