這兩天做一個socket通信的Demo,用定時器啟動client端去連接server端,出現一個狀況,連接幾次后定時器就停了。
下面就是會造成終止的代碼:
public class Client { public void Start() { Timer timer = new Timer(StartWork, null, 0, 100); } public void StartWork(object obj) { //執行工作 } }
經度娘,原因是timer被GC銷毀。
方法中的變量如果是值類型,在方法執行完會被自動釋放,因為是在棧上分配的空間。
但是方法中聲明的引用類型,是在堆上分配的,只能在gc中回收,方法執行后不會被立即回收。
GC回收對象的准則是:只要程序對一個對象的引用計數為0,就會被GC回收。
下面是解決辦法:
1、將timer聲明為全局變量
public class Client { Timer timer; public void Start() { timer = new Timer(StartWork, null, 0, 100); } public void StartWork(object obj) { //執行工作 } }
2、利用GC,不回收timer
public class Client { public void Start() { Timer timer = new Timer(StartWork, null, 0, 100); GC.KeepAlive(timer); } public void StartWork(object obj) { //執行工作 } }
