Przechodzę przez dużą refaktoryzację / poprawianie szybkości jednej z moich większych aplikacji MVC. Został wdrożony do produkcji od kilku miesięcy i zacząłem otrzymywać limity czasu oczekiwania na połączenia w puli połączeń. Wyśledziłem problem do nieprawidłowego usunięcia połączeń.
W związku z tym dokonałem tej zmiany w moim kontrolerze podstawowym:
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);
}
}
Teraz mam dwa pytania:
- Czy wprowadzam warunek wyścigu? Ponieważ
configManager
zarządza,DataContext
który udostępniaIQueryable<>
parametry widokom , muszę się upewnić, żeDispose()
nie zostanie wywołany na kontrolerze przed zakończeniem renderowania widoku. - Czy struktura MVC wywołuje
Dispose()
kontroler przed lub po renderowaniu widoku? A może struktura MVC pozostawia to GarbageCollector?