首页 > 代码库 > C# Threading.Timer 为什么一会儿自己停了
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 为什么一会儿自己停了
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。