C#使用计时器检测与服务器的断开连接

c# detecting disconnect from server with timer

我有一个客户端类型的应用程序正在从远程服务器接收数据包。 时不时地,由于某种原因,服务器断开了我的连接。 有时我这边的 ISP 会掉线等问题

我一直在尝试捕捉这些异常并在谷歌上搜索答案,但最后每一个 指向 "make a timer and check periodically for received packets."

现在我有一个功能可以接收所有传入的流量。 每次收到数据包时都会执行此函数。

现在我的想法是创建一个函数,该函数将创建超时时间为 50 秒的计时器。 每次收到数据包时,此函数都会将计时器重置为 0 并重新启动它。

如果计时器达到 50 秒,它将抛出错误 "disconnected!" 并且将遵循一些逻辑 如何重新连接。

现在我的主要问题是...我无法"pause" 我的主要数据包接收功能。 我试图在另一个线程中创建它,但程序不断重新创建新线程,按 ID 杀死线程是一种不好的做法,我还没有走那条路……但是。

这是我应该如何处理我的问题还是有人有更好的主意? 下面是我的数据包接收函数。

 public void OnReceive()
        {
           try
            {
               recv_pack = locSec.TrIncom();
                if (recv_pack != null)
                {
                    foreach (Packet packet in recv_pack)
                    {                     
                        byte[] packet_bytes = packet.GetBytes();

                        PacketHandler.HandlePacket(packet, locSec);
                        //here i would check for packet receive with timer                  
                        //CheckDisconnect();
                    }
                }
            }
            catch() 
            {}
        }

到目前为止我已经想到了这个:

public bool CheckDisconnect()
{
    bool KeepGoing = true;

    for(int i = 0 ; i <= 50 && KeepGoing; i++ )
    {
        Thead.Sleep(1000);

        if(i == 50)
        {
            KeepGoing = false;
            Console.WriteLine("Disconnected!");
            // ... starting reconnect procedure
        }
    }
}

不确定我是否完全理解,但是如果这两个函数在同一个线程中,你不能只创建一个全局变量来控制 OnReceive() 函数并在你的 CheckDisconnect() 函数中将它设置为 false ?