/ / Czy metoda wywołania sesji może być ustawiona na czas zakończenia sesji? - c #, asp.net-mvc

Czy metoda wywoływania sesji może być użyta w czasie zakończenia sesji? - c #, asp.net-mvc

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 № 1

Session_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