Je suis en train de refaire un gros refactoring/speed de l'une de mes plus grosses applications MVC. Il a été déployé en production depuis quelques mois maintenant, et je commençais à recevoir des délais d'attente pour les connexions dans le pool de connexions. J'ai suivi le problème jusqu'à ce que les connexions ne soient pas éliminées correctement.ASP MVC: Quand IController Dispose() est appelé?
À la lumière de cela, j'ai depuis fait ce changement à mon contrôleur 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);
}
}
Maintenant, j'ai deux questions:
- Suis-je l'introduction d'une condition de course? Depuis le
configManager
gère leDataContext
qui exposeIQueryable<>
paramètres à les vues, je dois vous assurer queDispose()
ne sera pas appelé sur le contrôleur avant que la vue termine le rendu. - Le cadre MVC appelle-t-il
Dispose()
sur le contrôleur avant ou après le rendu de la vue? Ou, le framework MVC laisse-t-il le au GarbageCollector?
Je suis tellement impatient de répondre à celui-ci! GRANDE question! –
Sans regarder autre code (le vôtre ou ASP.NET MVC ..) pourquoi exactement devez-vous annuler le configManager? Cela aide-t-il quelque chose? Réfléchissez bien avant qu'aucun d'entre vous "DUH" moi .. –
Je veux dire dans un cas général comme celui d'une condition de course peut facilement être enlevé comme ça. Dans ce cas particulier, je doute qu'une instance de contrôleur soit utilisée par plus d'un thread et qu'il n'y ait donc aucun risque de condition de concurrence. –