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
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。