簡體   English   中英

可以在會話結束時間調用會話方法嗎?

[英]Can session call dispose method on session ending time?

我想知道IDisposable對象是否會在會話結束時處置。

我知道,我可以自己處理Session結束事件。 但我想寫一個IDisposable類。

例如,我有

public class MyObject : IDisposable
{
    // some properties

    public void Dispose()
    {
        // disposing
    }
}

我需要在會話結束時間處理此對象:

    protected void Session_End(object sender, EventArgs e)
    {
        if (Session["key"] != null)
            ((MyObject)Session["key"]).Dispose();
    }

所以,我想在會話結束時間知道操作將自動執行或我需要如上所述編寫。

Session_End不會自動處理IDisposable對象,因此您的Session_End解決方案是正確的。

然而:

  • Session_End僅在使用“inproc”會話時調用(但對於其他類型,您需要可序列化的對象)
  • 它僅在會話超時到期后調用,因此您將此資源保留了20分鍾(或者超時)

因此,嘗試找到一個不需要在Session中存儲IDisposable對象的解決方案。

實現IDisposable接口的類的實例只有在您調用Dispose方法時才會被“處理”,無論是直接還是間接通過using構造。 當對象超出范圍時,它不會自動發生。

例如,這將是不好的做法;

public void SomeMethodCalledDuringSession()
{
    var resourceHog = new ResourceHog(); // where ResourceHog : IDisposable
    // Perform operations
}

無論您的ASP.NET會話結束如何,此對象永遠不會在此處正確處理。 但是,你可以在完成后直接調用Dispose ,或者更好的想法是這樣做;

public void SomeMethodCalledDuringSession()
{
    using(var resourceHog = new ResourceHog()) // where ResourceHog : IDisposable
    {
        // Perform operations
    }
}

這轉換為try ... finally模式,在finally子句中調用Dispose ,確保它被調用(除了少數幾種情況)。

編輯 :我也會讀這個; http://nitoprograms.blogspot.co.uk/2009/08/how-to-implement-idisposable-and.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM