做服务端心跳引发时,发现计时器只是执行一段时间后就不执行了(已解决)

最近在做Socket网络开发,首先必须解决得问题就是服务器与客户端之间通信的稳定性,最基本的可以用心跳来实现。我采用的是双向心跳机制,大致流程如下:

1.每隔一段时间,客户端主动给服务端发送一次心跳包。

2.服务端接收到客户端的心跳包后,立即回一个心跳包给客户端。

3.当服务器三次没有收到客户端的心跳包,则认为客户端已经断开连接。

4.当客户端发送三次心跳包给服务器后,都没有收到回复,则认为客户端已经与服务器失去连接。

嗨,和标题要说的问题扯远了。

在服务器定时检测客户端连接情况时,我采用的是System.Threading.Timer定时器来处理。但是后来测试的时候,发现这个执行一段时间后,就不再执行。觉得非常奇怪,后来经过分析和思考,发现用System.Threading.Timer启动定时器,只需要类似于下面的那样使用:

var timer = new System.Threading.Timer(CheckOnlineClient, null, 1000, 6000);

CheckOnlineClient就是检测客户端是否在线的方法

上面的定义是指延迟1秒开始计时,每隔6秒执行一次CheckOnlineClient方法。

但是我忘记了一个很重要的东西,那就是.NET CLR的自动回收机制,对于timer只有定义,没有引用,在CLR看来是应该被回收掉的。所以在一段时间后,timer就被回收掉了,就不可能还是继续执行CheckOnlineClient方法了。

原文地址:https://www.cnblogs.com/zwffff/p/2229007.html