Dispose versus Close versus Stop

Dispose 、Close 、 Stop

weak reference 弱引用

上一篇說明完Dispose用法後,還有另外兩個類似的東西,一個是close、一個是stop,在這邊稍微說明一下。

Dispose

  • 回收物件,無法再被使用。

Close

  • 可重新開啟,指標還會繼續指向參考,例如檔案控制或者IDbConnection

Stop

  • 保持狀態,可回到當初何時停止的狀態 例如 timer

 

memory leak

儘管有垃圾回收機制,能然可能造成記憶體溢位,例如物件沒有使用,但是還是持續被別的物件參考。

Event就是一個很平常的例子,例如一個物件被其他物件參考,被參考中的物件不會被回收,就算那被個參考已經沒有在使用,還是不會被回收。  如果再持續在同一個Event訂閱,再會在分配一段記憶體空間,一直持續下去,就會造成溢位,直到應用程式關閉。
解決方法:方法結束後,主動從Event解除訂閱,或者使用 Weak references 可避免一些記憶體溢位的情況,可參考 weak event pattern

 

Weak References

MSDN說明:表示弱式參考,即在參考物件的同時,仍允許系統透過記憶體回收來回收該物件。
weak reference 會一直保持物件的參考,就算該物件在範圍外,或者設定為null,在GC還沒有執行之前,都可以使用weak reference取回物件。
使用時機通常是執行大型物件的時候使用,原因可參考這邊
底下程式範例,可以看到,我的HugeClass,就算在範圍外,在GC.collect(),執行之前,還是可以透過weak reference,取回我原始的物件。
class Program
{
    static void Main(string[] args)
    {
        WeakReference w;

        using (var hugeClass = new HugeClass())
        {
            w = new WeakReference(hugeClass);
        }
        
        // 直接從記憶體取回HugeClass
        HugeClass originalHugeClass = w.Target as HugeClass;

        originalHugeClass.Main(); // output : I'm Huge

    }
}

class HugeClass : IDisposable
{
    public void Main() { Console.WriteLine("I'm Huge"); }

    public void Dispose()
    {
        
    }
}

參考:

https://www.dotblogs.com.tw/larrynung/archive/2011/03/09/21757.aspx

http://tipsandtricks.runicsoft.com/CSharp/WeakReferences.html

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。