您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在.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實現一個消息隊列,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。