C# 关于通讯观察线程(2) -- 断线重连

通讯观察线程是个有意思,又是非常实用的功能。

断线重连具体怎么实现呢,很多人都实现过,那么TouchSocket等几个通讯组件中也包含有,都是可以拿来就用。只是,对于高级用户和特别细节操作要求的,是会自定义特别的超时断线业务规则。

首先要有三个方法, start, stop和Restart

/// <summary>
/// 启动
/// </summary>
public bool Start()
{try{//先执行ping 命令KeepServer = true;IPAddress ip = IPAddress.Parse(ComPara.ServerIP);IPEndPoint ipep = new IPEndPoint(ip, ComPara.Port);Tcpsocket.Connect(ipep);processor = new Thread(Communication);processor.IsBackground = true;                processor.Start();return true;}catch (Exception ex){KeepServer = false; //ex.LogError();return false;}finally{this.communicationobserve_timer.Enabled = true;}
}/// <summary>
/// 停止服务
/// </summary>
public bool Stop()
{try{IsStop = true;this.communicationobserve_timer.Enabled = false;KeepServer = false;Tcpsocket.Close();Tcpsocket.Dispose();if (processor != null ) {processor.Abort();//解决线程过多情况,因为线程执行Abort,状态是AbortRequested,还是会存在继续执行while (processor.ThreadState != ThreadState.Aborted){ Thread.Sleep(100); }LogHelper.WorkAndInfo($"LB600 停止服务 Stop();");}return true;}catch //(Exception ex){   //ex.LogError();return false;}
}/// <summary>
/// 重新启动 
/// </summary>
protected bool ReStart()
{ try{KeepServer = true;  //return Start();IPAddress ip = IPAddress.Parse(ComPara.ServerIP);IPEndPoint ipep = new IPEndPoint(ip, ComPara.Port);Tcpsocket.Connect(ipep);  //IP和端口processor = new Thread(Communication);processor.IsBackground = true;processor.Start();//DelegateState.InvokeDispatchStateEvent($" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} {this.DeviceCode}号机器人,恢复连接成功!");//Comm.Speak($" {this.DeviceCode}号机器人,启动重连中");return true;}catch //(Exception ex){KeepServer = false;  //ex.LogError();return false;}
}

第二,要有Reconnect()方法

     /// <summary>/// 重新创建连接/// </summary>public void ReConnect() {try{if (Init()){                if (ReStart()){LastConnectTime = DateTime.Now;  //LastRecTime 在有反馈时才记录Comm.Speak($"{DeviceCode}号设备,掉线后重连成功!");}}}catch (Exception ex){LogHelper.Error("尝试连接" + $" 将在3秒后重新尝试连接...", ex);            }}

最重要的是最后这个通讯的超时监测,这里设置就是重联达到的条件,至于两个超时变量如下面定义:

/// <summary>
/// 通讯状态观察
/// </summary>
private void CommunicationObser(object sender, ElapsedEventArgs e)
{try{communicationobserve_timer.Enabled = false;//if (Monitor.TryEnter(lockobj, TimeSpan.FromSeconds(1))){//先判断 机器人是否已经掉线if (LastRecLong > 2) //调试时修改为300, 默认1秒,{//如果接受消息时间已经大于1秒,则认为掉线了if (LastConnectLong > 3)  //调试时修改为500, 默认3秒{                   //如果车子掉线且连接时间超过3秒则需要重连LogHelper.WriteSendAGVMessLog($"重连 {DeviceCode}号"); //调试时暂时注释掉//ReConnect(); 添加了LastRecTime = DateTime.Now;LastRecTime = DateTime.Now;Comm.Speak($"{DeviceCode}号,掉线后尝试重连");ReConnect();}}}}catch (Exception ex){        LogHelper.Error($"观察线程异常:{ex.Message}", ex);}finally{communicationobserve_timer.Enabled = true;}
}/// <summary>/// 最后一次重新连接的时间/// </summary>public DateTime LastConnectTime { get; set; }/// <summary>/// 距最后一次重连接的时长(秒)/// </summary>public double LastConnectLong{get{return (DateTime.Now - LastConnectTime).TotalSeconds;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理实验三(IIR数字滤波器设计)

IIR数字滤波器设计&#xff08;2学时&#xff09; 要求&#xff1a; 产生一复合信号序列&#xff0c;该序列包含幅度相同的28Hz、50Hz、100Hz、150Hz的单音&#xff08;单频&#xff09;信号&#xff1b;其中&#xff0c;50Hz及其谐波为工频干扰&#xff08;注&#xff1a;采样…

Chrome Extension如何让work flow在页面刷新、跳转继续执行任务

从Electron到Chrome Extension:流程自动化的跨平台探索 在之前的项目中,我使用Electron成功实现了一个流程自动化应用,它极大地提高了工作效率。然而,当面对Chrome扩展程序(Extension)的需求时,我意识到需要一种新的策略来应对浏览器环境下的限制。特别是Chrome Extens…

SII9134CTU HDMI发射芯片

SII9134 HDMI深彩色发射机是第三代高清晰度多媒体接口(HDMI)发射机&#xff0c;支持HDMI 1.3规范。 这款完全符合hdmi标准的设备提供了一种简单、低成本的方法来发送受保护的数字音频和视频&#xff0c;为最终用户提供真正的全数字体验。AV接收器&#xff0c;以及蓝光和HD DVD…

2024年6月27日,欧盟REACH法规新增第31批1项SVHC高关注物质

ECHA公布第31批1项SVHC&#xff0c;物质已增至241项 2024年6月27日&#xff0c;ECHA公布第31批1项SVHC&#xff0c;总数达241项。新增物质未包括磷酸三苯酯&#xff0c;仍在评议中。REACH法规要求SVHC含量超0.1%需告知下游&#xff0c;出口超1吨须通报ECHA。SCIP通报要求SVHC含…

MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.

【问题描述】 MySQL 8.4版本&#xff0c;配置用户使用mysql_native_password认证插件验证用户身份&#xff0c;报错&#xff1a; 【解决方法】&#xff08;Windows, MySQL 8.4) 1、修改MySQL配置文件my.ini&#xff0c;在[mysqld]段添加mysql_native_passwordON。 2、管理员…

uni-app 自定义支付密码键盘

1.新建最贱 payKeyboard .vue <template><view class"page-total" v-show"isShow"><view class"key-list"><view class"list" v-for"(item,index) in keyList" :class"{special:item.keyCode190…

LeetCode 53.最大子数组和(dp)

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;…

《雁门太守行》

作者 李贺 【唐代】 全文&#xff1a; 黑云压城城欲摧&#xff0c;甲光向日金鳞开。 角声满天秋色里&#xff0c;塞上燕脂凝夜紫。 半卷红旗临易水&#xff0c;霜重鼓寒声不起。 报君黄金台上意&#xff0c;提携玉龙为君死。 提示&#xff1a; (塞上 一作&#xff1a;塞土) …

描述ifstream、ofstream和fstream类的用途

ifstream、ofstream和fstream是C标准库<fstream>中提供的三个重要的文件流类&#xff0c;它们分别用于文件的读取、写入和读写操作。以下是这三个类的详细用途描述&#xff1a; ifstream类&#xff08;输入文件流类&#xff09;&#xff1a; 用途&#xff1a;ifstream类…

JavaScript:实现内容显示隐藏(展开收起)功能

一、场景 点击按钮将部分内容隐藏&#xff08;收起&#xff09;&#xff0c;再点击按钮时将内容显示&#xff08;展开&#xff09;出来。 二、技术摘要 js实现实现内容显示隐藏js动态给ul标签添加li标签js遍历数组 三、效果图 四、代码 js_block_none.js代码 var group1 doc…

网工内推 | 网络工程师,IE认证优先,最高18k*14薪,周末双休

01 上海吾索信息科技有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;岗位职责&#xff1a; 1&#xff09;具备网络系统运维服务经验以及数据库实施经验&#xff0c;具备网络系统认证相关资质或证书&#xff1b; 2&#xff09;掌握常用各设备的运维巡检…

GESP 四级急救包(3):押题急救

常见算法攻克 一、素数1. 素数判断2. 素数筛法 二、数据转换1. 字符串转换2. 进制转换2.1 将 x x x 进制转换为 10 10 10 进制2.2 将 10 10 10 进制转换为 x x x 进制 三、字符串1. 字符串替换2. 其他题目 一、素数 1. 素数判断 bool isPrime(int n) {if (n < 2) retu…

Java---Maven详解

一段新的启程&#xff0c; 披荆斩棘而前&#xff0c; 心中的梦想&#xff0c; 照亮每个黑暗的瞬间。 无论风雨多大&#xff0c; 我们都将坚强&#xff0c; 因为希望的火焰&#xff0c; 在胸中永不熄灭。 成功不是终点&#xff0c; 而是每一步的脚印&#xff0c; 用汗水浇灌&…

uni-appx使用form表单页面初始化报错

因为UniFormSubmitEvent的类型时 e-->detail-->value,然后没有了具体值。所以页面初始化的时候 不能直接从value取值&#xff0c;会报错找不到 所以form表单里的数据我们要设置成一个对象来存放 这个问题的关键在于第22行代码 取值&#xff1a; 不能按照点的方式取值 …

java23种设计模式之策略模式

概述 策略模式是23种设计模式之一&#xff0c;也是工作中出现频率比较高的设计模式之一&#xff0c;策略模式主要是为了针对不通业务场景做出不同行为的一种设计模式。该模式一般可以直接替换多个if eles 的场景。策略模式主要分为三个部分&#xff0c;策略接口&#xff0c;具体…

[数据集][目标检测]棉花叶子害虫检测数据集VOC+YOLO格式595张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;595 标注数量(xml文件个数)&#xff1a;595 标注数量(txt文件个数)&#xff1a;595 标注类别…

找不到xinput1_3.dll怎么办,实测有效的几种方法分享

在日的使用电脑过程中&#xff0c;我们经常会遇到各种各样的问题。其中之一就是找不到xinput1_3.dll文件。这个问题可能会影响到我们的游戏体验&#xff0c;甚至导致电脑无法正常运行。那么&#xff0c;又该如何解决这个问题呢&#xff1f;小编将全面解析找不到xinput1_3.dll对…

老无忧,成熟人士都在玩的社交app

随着互联网向不同年龄群体的进一步渗透&#xff0c;越来越多大龄人士逐步在传统以年轻人为主的平台中搭建起自己的空间&#xff0c;对缔结社交关系的需求也变得强烈起来。老无忧无忧交友app应运而生&#xff0c;于2024年6月1日正式上线&#xff08;以下简称“老无忧”&#xff…

深入解析npm install --save-dev:开发依赖管理的艺术

npm&#xff08;Node Package Manager&#xff09;是JavaScript编程语言的包管理器&#xff0c;用于管理项目中的依赖关系。在开发过程中&#xff0c;合理地管理依赖是保证项目可维护性和可扩展性的关键。npm install命令是npm中最常用的命令之一&#xff0c;而--save-dev参数则…

基于Java仓储出入库管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…