2016-04-04 6 views
0

状況1および/または2は、GCを待つことを避けて座ります。私は、複数回使用されているコンテキストが、私たちのコードに、ブロックを使用するだけの方法を持たせていることがわかりました。コンテキストがすぐに十分に処理されれば、そのような場合にはブロックを使用しないでください。一例としては、何らかのセーブを行い、コンテキストを開き、複数のテーブルにデータを保存する方法>であり、次に200 OKを返します。状況が様々な状況で処理されるのはいつですか

状況1

public function test() 
{ 
    return new myContext().Events.FirstOrDefault(); 
} 

状況2

public function test2() 
{ 
    var ctx = new myContext(); 

    return ctx.Events.FirstOrDefault(); 
} 

状況3

public function test3() 
{ 
    Event e; 
    using(var ctx = new myContext()) { 
     e = ctx.Events.FirstOrDefault(); 
    } 

    return e; 
} 
+0

https://msdn.microsoft.com/en-us/data/dn456849.aspx – skalinkin

答えて

0

任意のインスタンスは約座ってGCを待っています。使用する場合は、採取する準備ができていることを示します(解決法3)。ソリューション1.2は、スコープを終了した後も同様に動作します。

+0

私はこれが正しいとは思わない。行動します使い方私が信じる物を捨て去る。 – matthewdaniel

+0

これは正しいです。 usingはIDisposableインスタンスでDisposeメソッドを呼び出します。しかし、GCがそれをきれいにすることを保証するものではありません。ガベージコレクションの準備ができたら簡単にマークします。それでもまだ参照がある場合は、ガベージコレクションされません。 – skalinkin

+0

スコープを終了した後も1,2は同じようになります。役に立つリンクがありますか?では、3つのアプローチの違いはほとんどありませんか? – matthewdaniel

-1

解決策1と解決策2は、コンテキストを破棄しません。コンテキストを破棄すると、アンマネージリソースがクリーンアップされます。コンテキストをnullに設定したり、スコープから離しても、このようなクリーンアップは発生しません。あなたはusing構文を使用するか、明示的にcontext.Disposetry...finallyまたは任意の他の好適な方法のいずれか(たとえば、あなたがIDisposableを実装するカスタムクラスを作成することを決定し、そこにコンテキストを処分することができる)

を呼び出すいくつかのコードを追加する必要がありますどちらかEntity Framework and context dispose

Uses of "using" in C#

Will the Garbage Collector call IDisposable.Dispose for me?

+1

ここに興味深い記事http://blog.jongallant.com/2012/10/ do-i-have-to-call-dispose-on-dbcontext.html#.U6WdzrGEeTwは、処分が実際には必要でないことを示すようです。思考? – matthewdaniel

関連する問題