C# Threading.Timer 為什么一會兒自己停了


      這兩天做一個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)
    {
       //執行工作
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM