博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Threading.Timer 为什么一会儿自己停了
阅读量:5035 次
发布时间:2019-06-12

本文共 911 字,大约阅读时间需要 3 分钟。

      这两天做一个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)    {       //执行工作    }}

 

转载于:https://www.cnblogs.com/ichenhao/p/6088334.html

你可能感兴趣的文章
程序员高效开发的几个技巧
查看>>
hexo 搭建博客
查看>>
建造者模式(屌丝专用)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
酷狗的皮肤文件存放在哪
查看>>
C++的引用
查看>>
T-SQL查询进阶--深入浅出视图
查看>>
Android读取url图片保存及文件读取
查看>>
完整ASP.Net Excel导入
查看>>
循环队列的运用---求K阶斐波那契序列
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
Android Studio默认快捷键
查看>>
函数式编程与参数
查看>>
HDU 2191 【多重背包】
查看>>
51nod 1433 0和5【数论/九余定理】
查看>>
[Qt] this application failed to start because it could not find or load the Qt platform plugin
查看>>