Sto passando attraverso un grande refactoring/velocizzazione di una delle mie applicazioni MVC più grandi. È stato distribuito in produzione per alcuni mesi e stavo iniziando a ottenere timeout in attesa di connessioni nel pool di connessioni. Ho rintracciato il problema fino a quando le connessioni non vengono smaltite correttamente.ASP MVC: quando viene chiamato IController Dispose()?
Alla luce di questo, allora ho fatto questo cambiamento al mio controller di 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);
}
}
Ora, ho due domande:
- Perchè sono l'introduzione di una condizione di competizione? Dal momento che il
configManager
gestisce ilDataContext
che esponeIQueryable<>
parametri i punti di vista, ho bisogno di fare in modo cheDispose()
non sarà chiamato sul controller prima che la vista finisce di rendering. - Il framework MVC chiama
Dispose()
sul controller prima o dopo il rendering della visualizzazione? Oppure, il framework MVC lascia quello fino a GarbageCollector?
Sono così bello guardare avanti per la risposta a questo! GRANDE domanda! –
Senza guardare altro codice (tuo o ASP.NET MVC ..) perché esattamente hai bisogno di annullare il configManager? Questo aiuta qualcosa? Pensa bene prima che qualcuno di voi "DUH" me .. –
Intendo in un caso generale come quello, una condizione di competizione può essere facilmente rimossa in questo modo. In questo caso specifico dubito che un'istanza del controllore possa essere utilizzata da più di un thread e quindi non vi è alcun rischio di una condizione di competizione di sorta. –