4

IDisposableオブジェクトがセッションの終了時に破棄されるかどうかを知りたいです。

私はセッション終了イベントで自分で処分することができます。しかし、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();
    }

ですから、セッション終了時に自動的に動作するか、上記のように書く必要があるか知りたいです。

4

2 に答える 2

4

Session_EndはIDisposableオブジェクトを自動的に破棄しないため、Session_Endソリューションは正しいです。

でも:

  • Session_Endは、「inproc」セッションを使用する場合にのみ呼び出されます(ただし、他のタイプの場合は、シリアル化可能なオブジェクトが必要になります)
  • セッションタイムアウトの期限が切れた後にのみ呼び出されるため、このリソースをさらに20分間(またはタイムアウトが何であれ)保持しました。

したがって、IDisposableオブジェクトをSessionに格納する必要のないソリューションを見つけてください。

于 2012-09-10T08:15:05.837 に答える
1

インターフェイスを実装するクラスのインスタンスは、直接または構成を介して間接的IDisposableにメソッドを呼び出すたびにのみ「破棄」されます。オブジェクトがスコープから外れるたびに自動的に発生するものではありません。Disposeusing

たとえば、これは悪い習慣です。

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これはパターンに変換さDisposeれ、finally句にtoが呼び出され、(いくつかのまれな状況を除いて)確実に呼び出されます。

編集:私もこれを読みます。http://nitoprograms.blogspot.co.uk/2009/08/how-to-implement-idisposable-and.html

于 2012-09-10T07:44:46.710 に答える