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.pswp.cn/diannao/37213.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37213.shtml
英文地址,請注明出處:http://en.pswp.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;還…