C# Threading.Timer 为什么一会儿自己停了

Posted ichenhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
    {
       //执行工作
    }
}

 

以上是关于C# Threading.Timer 为什么一会儿自己停了的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中创建计时器而不使用 System.Timers.Timer 或 System.Threading.Timer

C# System.Threading.Timer如何停止

捕获倒计时或滴答事件 - Threading.Timer C#

C# 计时器用法(DispatcherTimerSystem.Timers.TimerSystem.Threading.Timer)

C# 中的 System.Threading.Timer 似乎无法正常工作。它每 3 秒运行一次非常快

如何使用 System.Threading.Timer c# 在同一线程上运行代码