亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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);
      }

      // 如果還沒連接不符合結束條件則睡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#使用StreamWriter寫入文件的方法

    C#使用StreamWriter寫入文件的方法

    這篇文章主要介紹了C#使用StreamWriter寫入文件的方法,涉及C#中StreamWriter類操作文件的相關技巧,需要的朋友可以參考下
    2015-05-05
  • C#讀取CSV文件的方法總結

    C#讀取CSV文件的方法總結

    CSV文件是一種簡單的文本文件格式,用于存儲表格數(shù)據(jù),在C#中,有多種方法可以用于讀取CSV文件,本文將介紹幾種常見的讀取CSV文件的方法,包括使用System.IO命名空間中的類、使用CsvHelper庫以及使用LINQ,需要的朋友可以參考下
    2024-05-05
  • C#遞歸算法之打靶算法分析

    C#遞歸算法之打靶算法分析

    這篇文章是對打靶算法分析,比較簡單,但邏輯一定要清楚,分析問題的方法一定要準確,有需要的朋友可以參考一下。
    2016-06-06
  • C#中單例模式的三種寫法示例

    C#中單例模式的三種寫法示例

    這篇文章主要介紹了C#中單例模式的三種寫法示例,本文分別給出代碼實例,需要的朋友可以參考下
    2015-06-06
  • C#實現(xiàn)塊狀鏈表的項目實踐

    C#實現(xiàn)塊狀鏈表的項目實踐

    這篇文章主要介紹了C#實現(xiàn)塊狀鏈表的項目實踐,通過定義塊和鏈表類,利用塊內(nèi)元素引用實現(xiàn)塊與塊之間的鏈接關系,從而實現(xiàn)對塊狀鏈表的遍歷、插入和刪除等操作,感興趣的可以了解一下
    2023-11-11
  • 經(jīng)典實例講解C#遞歸算法

    經(jīng)典實例講解C#遞歸算法

    這篇文章主要用實例講解C#遞歸算法的概念以及用法,文中代碼非常詳細,幫助大家更好的參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • C#自定義特性(Attribute)詳解

    C#自定義特性(Attribute)詳解

    本文詳細講解了C#的自定義特性(Attribute),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#使用Log4.net記錄日志文件

    C#使用Log4.net記錄日志文件

    這篇文章介紹了C#使用Log4.net記錄日志文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • string與stringbuilder兩者的區(qū)別

    string與stringbuilder兩者的區(qū)別

    今天小編就為大家分享一篇關于string與stringbuilder兩者的區(qū)別,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像

    WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像

    這篇文章介紹了WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論