中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在.NetCore中使用BlockingCollection實現一個消息隊列

發布時間:2021-01-21 15:53:44 來源:億速云 閱讀:509 作者:Leah 欄目:開發技術

本篇文章為大家展示了如何在.NetCore中使用BlockingCollection實現一個消息隊列,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

消息隊列現今的應用場景越來越大,常用的有RabbmitMQ和KafKa。

我們用BlockingCollection來實現簡單的消息隊列。

BlockingCollection實現了生產者/消費者模式,是對IProducerConsumerCollection<T>接口的實現。與其他Concurrent集合一樣,每次Add或Take元素,都會導致對集合的lock。只有當確定需要在內存中創建一個生產者,消費者模式時,再考慮這個類。

MSDN中的示例用法:

using (BlockingCollection<int> bc = new BlockingCollection<int>())
  {
    Task.Factory.StartNew(() =>
    {
      for (int i = 0; i < 1000; i++)
      {
        bc.Add(i);
        Thread.Sleep(50); 
      }
 
 
      // Need to do this to keep foreach below from hanging
      bc.CompleteAdding();
    });
 
 
    // Now consume the blocking collection with foreach.
    // Use bc.GetConsumingEnumerable() instead of just bc because the
    // former will block waiting for completion and the latter will
    // simply take a snapshot of the current state of the underlying collection.
    foreach (var item in bc.GetConsumingEnumerable())
    {
      Console.WriteLine(item);
    }
  }

實現消息隊列

用Vs2017創建一個控制臺應用程序。創建DemoQueueBlock類,封裝一些常用判斷。

  • HasEle,判斷是否有元素

  • Add向隊列中添加元素

  • Take從隊列中取出元素

為了不把BlockingCollection直接暴漏給使用者,我們封裝一個DemoQueueBlock類

  /// <summary>
  /// BlockingCollection演示消息隊列
  /// </summary>
  /// <typeparam name="T"></typeparam>
  public class DemoQueueBlock<T> where T : class
  {
    private static BlockingCollection<T> Colls;
    public DemoQueueBlock()
    {

    }
    public static bool IsComleted() {
      if (Colls != null && Colls.IsCompleted) {
        return true;
      }
      return false;
    }
    public static bool HasEle()
    {
      if (Colls != null && Colls.Count>0)
      {
        return true;
      }
      return false;
    }
    
    public static bool Add(T msg)
    {
      if (Colls == null)
      {
        Colls = new BlockingCollection<T>();
      }
      Colls.Add(msg);
      return true;
    }
    public static T Take()
    {
      if (Colls == null)
      {
        Colls = new BlockingCollection<T>();
      }
      return Colls.Take();
    }
  }

  /// <summary>
  /// 消息體
  /// </summary>
  public class DemoMessage
  {
    public string BusinessType { get; set; }
    public string BusinessId { get; set; }
    public string Body { get; set; }
  }

添加元素進隊列

通過控制臺,添加元素

  //添加元素
      while (true)
      {
        Console.WriteLine("請輸入隊列");
        var read = Console.ReadLine();
        if (read == "exit")
        {
          return;
        }

        DemoQueueBlock<DemoMessage>.Add(new DemoMessage() { BusinessId = read });
      }

消費隊列

通過判斷IsComleted,來確定是否獲取隊列

 Task.Factory.StartNew(() =>
      {
        //從隊列中取元素。
        while (!DemoQueueBlock<DemoMessage>.IsComleted())
        {
          try
          {
            var m = DemoQueueBlock<DemoMessage>.Take();
           Console.WriteLine("已消費:" + m.BusinessId);
          }
          catch (Exception ex)
          {
            Console.WriteLine(ex.Message);
          }
        }
      });

查看運行結果

如何在.NetCore中使用BlockingCollection實現一個消息隊列

上述內容就是如何在.NetCore中使用BlockingCollection實現一個消息隊列,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

全椒县| 双流县| 化隆| 高碑店市| 衡山县| 伊金霍洛旗| 辽源市| 河津市| 塔城市| 兰西县| 临沂市| 花莲市| 铜鼓县| 泸水县| 大同市| 本溪市| 东乡县| 万年县| 石首市| 保康县| 临沭县| 淮安市| 莱州市| 绥棱县| 西藏| 荃湾区| 晋宁县| 望谟县| 武穴市| 乌拉特中旗| 静海县| 施秉县| 固镇县| 特克斯县| 比如县| 黎川县| 白朗县| 崇阳县| 石嘴山市| 平江县| 清新县|