Przechodzę przez duży usprawnienia/dostosowania prędkości jednej z moich większych aplikacji MVC. Został wdrożony do produkcji od kilku miesięcy i zaczynałem otrzymywać limity czasu oczekujące na połączenia w puli połączeń. Zidentyfikowaliśmy problem, aby połączenia nie zostały odpowiednio usunięte.ASP MVC: Kiedy wywoływana jest funkcja IController Dispose()?
W świetle tego, mam od dokonaniu tej zmiany do mojego kontrolera 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);
}
}
Teraz mam dwa pytania:
- jestem wprowadzające stan wyścigu? Od
configManager
zarządzaDataContext
, który udostępnia parametryIQueryable<>
do widoków, muszę się upewnić, żeDispose()
nie zostanie wywołany na kontroler przed zakończeniem renderowania widoku. - Czy środowisko MVC wywołuje
Dispose()
na kontrolerze przed lub po wyświetleniu widoku? A może ramy MVC pozostawiają ten obiekt w GarbageCollector?
Jestem bardzo zadowolony z odpowiedzi na to pytanie! WIELKIE pytanie! –
Bez patrzenia na inny kod (twój lub ASP.NET MVC ..), dlaczego dokładnie trzeba zerwać configManager? Czy to coś pomoże? Pomyśl dokładnie zanim ktokolwiek z was "DUH" mnie .. –
Mam na myśli, że w tak ogólnym przypadku warunki wyścigu mogą być łatwo usunięte, jak to się dzieje. W tym konkretnym przypadku wątpię, aby instancja kontrolera była używana przez więcej niż jeden wątek i dlatego nie ma ryzyka jakiegokolwiek stanu wyścigu. –