最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Mqtt 斷線重連的實現(xiàn)代碼

 更新時間:2019年09月01日 11:27:20   作者:時間維度  
這篇文章主要介紹了C# Mqtt 斷線重連,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在通過 MqttClient 客戶端連接之后,在服務端服務重啟時,客戶端如果沒有重連機制,則無法再接收到訂閱的消息。

使用的 Mqtt 組件為:M2Mqtt.Net.dll

一些特性發(fā)現(xiàn)

(1)如果提供的服務端地址是不可解析的,會引發(fā)異常無法實例化 MqttClient 對象。
(2)Connect 無法連接時會引發(fā)異常,IsConnected 為 false。
(3)服務端斷開會觸發(fā)客戶端的 ConnectionClosed 事件,IsConnected 為 false。
(4)重新 Connect 需要重新 Subscribe 訂閱主題。
(5)MqttClient.Subscribe 第一個參數(shù)為訂閱主題數(shù)組,第二個為相應的 qosLevel,兩個數(shù)組長度必須一致,否則會異常。

重連流程控制

主要代碼實現(xiàn)

(1)線程主體

// 自動重連主體
private void _TryContinueConnect()
{
  if (IsConnected) return;

  Thread retryThread = new Thread(new ThreadStart(delegate
  {
    while (_MqttClient == null || !_MqttClient.IsConnected)
    {
      if (_ToClose) break;

      if (_MqttClient == null)
      {
        _BuildClient();
        Thread.Sleep(3000);
        continue;
      }

      try
      {
        _TryCount++;
        _Connect(); 
      }
      catch (Exception ce)
      {
        Debug.WriteLine("re connect exception:" + ce.Message);
      }

      // 如果還沒連接不符合結(jié)束條件則睡2秒
      if (!_MqttClient.IsConnected)
      {
        Thread.Sleep(2000);
      }
    }
  }));
      
  retryThread.Start();
}

(2)實例化部分

// 實例化客戶端
private void _BuildClient()
{
  try
  {
    _MqttClient = new MqttClient(_MqttServer);
  }
  catch (Exception e)
  {
    Debug.WriteLine("build client error:" + e.Message);
    return;
  }

  // 消息到達事件綁定
  _MqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

  // 連接斷開事件綁定
  _MqttClient.ConnectionClosed += (sender, e) =>
  {
    if (!_ToClose)
    {
      // 嘗試重連
      _TryContinueConnect();
    }
  };
}

(3)嘗試連接部分

// 發(fā)起一次連接,連接成功則訂閱相關主題 
private void _Connect()
{
  if (String.IsNullOrEmpty(_MqttUsername))
  {
    var b = _MqttClient.Connect(_MqttClientId);
  }
  else
  {
    var b = _MqttClient.Connect(_MqttClientId, _MqttUsername, _MqttUserpass);
  } 

  if (_MqttClient.IsConnected)
  {
    _MqttClient.Subscribe(new string[] { "topic1", "topic2" },
      new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
  }
}

實測效果不錯,其中延時時間可以適當調(diào)整。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#實現(xiàn)將窗體固定在顯示器的左上角且不能移動的方法

    C#實現(xiàn)將窗體固定在顯示器的左上角且不能移動的方法

    這篇文章主要介紹了C#實現(xiàn)將窗體固定在顯示器的左上角且不能移動的方法,涉及C#窗體固定操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • 深入C#中get與set的詳解

    深入C#中get與set的詳解

    本篇文章是對C#中的get與set進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • C# List的賦值問題的解決

    C# List的賦值問題的解決

    本文主要介紹了C# List的賦值問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • VB.NET中TextBox的智能感知應用實例

    VB.NET中TextBox的智能感知應用實例

    這篇文章主要介紹了VB.NET中TextBox的智能感知應用實例,非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • .NET操作瀏覽器執(zhí)行JS的方法步驟

    .NET操作瀏覽器執(zhí)行JS的方法步驟

    Selenium WebDriver是用于Web應用程序測試的強大工具,它可以直接與瀏覽器進行通信,就像用戶在本地或遠程機器上操作一樣,WebDriver支持多種編程語言綁定,如Java、Python、C#等,所以本文給大家介紹了.NET操作瀏覽器執(zhí)行JS的方法步驟,需要的朋友可以參考下
    2025-09-09
  • c#模擬js escape方法的簡單實例

    c#模擬js escape方法的簡單實例

    這篇文章主要介紹了c#模擬js escape方法的簡單實例,有需要的朋友可以參考一下
    2013-11-11
  • C#中如何獲取當前目錄和上級目錄

    C#中如何獲取當前目錄和上級目錄

    這篇文章主要介紹了C#中如何獲取當前目錄和上級目錄問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#中async await異步關鍵字用法和異步的底層原理全解析

    C#中async await異步關鍵字用法和異步的底層原理全解析

    這篇文章主要介紹了C#中async await異步關鍵字用法和異步的底層原理全解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • 圖形學之Unity渲染管線流程分析

    圖形學之Unity渲染管線流程分析

    這篇文章主要介紹了圖形學之Unity渲染管線流程的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C# 和 Python 的 hash_md5加密方法

    C# 和 Python 的 hash_md5加密方法

    這篇文章主要介紹了C# 和 Python 的 hash_md5加密方法,文章圍繞著C# 和 Python 的 hash_md5加密的相關資料展開文章的詳細呢偶然,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11

最新評論

福海县| 柘城县| 昌平区| 永春县| 富阳市| 石楼县| 开远市| 如东县| 蛟河市| 仁寿县| 廊坊市| 新乡县| 平山县| 博野县| 桐乡市| 西城区| 南平市| 宜良县| 龙里县| 秦安县| 洛浦县| 景东| 铜陵市| 永安市| 南雄市| 乳山市| 绥化市| 赤峰市| 织金县| 高要市| 马山县| 东港市| 华蓥市| 雷州市| 运城市| 松桃| 广饶县| 准格尔旗| 富阳市| 沙田区| 蕲春县|