Chcę wiedzieć, czy obiekty IDisposable zostaną usunięte po zakończeniu sesji.
Wiem, że sam mogę wydać na zakończenie sesji. Ale chcę napisać klasę IDisposable.
Na przykład, mam
public class MyObject : IDisposable
{
// some properties
public void Dispose()
{
// disposing
}
}
i muszę pozbyć się tego obiektu w czasie zakończenia sesji:
protected void Session_End(object sender, EventArgs e)
{
if (Session["key"] != null)
((MyObject)Session["key"]).Dispose();
}
Tak więc chcę wiedzieć, kiedy sesja zakończy się, ta operacja nastąpi automatycznie lub potrzebuję napisać jak powyżej.
Odpowiedzi:
3 dla odpowiedzi № 1Session_End nie usuwa automatycznie obiektów IDisposable, więc twoje rozwiązanie Session_End jest poprawne.
Jednak:
- Session_End jest wywoływany tylko wtedy, gdy używasz sesji „inproc” (ale dla innych typów potrzebny byłby obiekt serializowalny)
- Jest on wywoływany tylko po upływie limitu czasu sesji, więc zachowałeś ten zasób przez dodatkowe 20 minut (lub jakikolwiek jest twój limit czasu)
Spróbuj więc znaleźć rozwiązanie, które nie wymaga przechowywania obiektów IDisposable w sesji.
1 dla odpowiedzi nr 2
Instancja klasy, która implementuje IDisposable
interfejs zostanie „usunięty” tylko wtedy, gdy zadzwonisz na Dispose
metoda, bezpośrednio lub pośrednio poprzez using
skonstruować. To nie jest coś, co dzieje się automatycznie, gdy obiekt nie wchodzi w zakres.
Na przykład byłoby to złą praktyką;
public void SomeMethodCalledDuringSession()
{
var resourceHog = new ResourceHog(); // where ResourceHog : IDisposable
// Perform operations
}
Obiekt nigdy nie jest prawidłowo rozmieszczany tutaj, niezależnie od zakończenia sesji ASP.NET. Możesz jednak zadzwonić Dispose
bezpośrednio po zakończeniu, lub lepszym pomysłem jest to zrobić;
public void SomeMethodCalledDuringSession()
{
using(var resourceHog = new ResourceHog()) // where ResourceHog : IDisposable
{
// Perform operations
}
}
Przekłada się to na try ... finally
wzór, z wezwaniem do Dispose
w finally
klauzula zapewniająca, że zostanie wywołana (z wyjątkiem kilku rzadkich sytuacji).
Edytować: Chciałbym też to przeczytać; http://nitoprograms.blogspot.co.uk/2009/08/how-to-implement-idisposable-and.html