項目開發中應用併發的一二事

来源:https://www.cnblogs.com/zhiyong-ITNote/archive/2018/01/13/8279140.html
-Advertisement-
Play Games

在多線程環境下,使用BlockingCollection以及ConcurrentQueue來消費生產者生產的資源,這是我自己寫的多生產者多消費者的作法,其實也是基於單個task下的阻塞隊列的IsComplete來識別的。 使用阻塞隊列更簡單但是內部的消費者線程比較適合使用單獨的線程不適合使用線程池, ...


在多線程環境下,使用BlockingCollection以及ConcurrentQueue來消費生產者生產的資源,這是我自己寫的多生產者多消費者的作法,其實也是基於單個task下的阻塞隊列的IsComplete來識別的。

使用阻塞隊列更簡單但是內部的消費者線程比較適合使用單獨的線程不適合使用線程池,而且阻塞隊列為空時會阻塞消費者線程,當然阻塞線程池內的線程也沒什麼影響只是不推薦這麼做,而且阻塞的隊列的性能也沒有ConcurrentQueue的性能高。

我在項目中遇到多生產者多消費者問題,多生產者沒有問題,但是如何在多線程下消費生產者的資源,這就是比較麻煩了,不能僅僅通過判斷數量來做,網上也找了一些資源,但是也都是給了個demo,還不全,自己想了個方法,暫時解決了,回頭在研究下別人封裝的基於Thread的作法。其實是在<<.NET 中的阻塞隊列BlockingCollection的正確打開方式>>基礎上做的,也沒有什麼,但是這是個好思路。後續嘗試自己封裝線程標誌來做,不依靠FCL的阻塞隊列。code如下:

ConcurrentDictionary<string, string> dic1 = new ConcurrentDictionary<string, string>();
            ConcurrentDictionary<string, string> dic2 = new ConcurrentDictionary<string, string>();
            ConcurrentQueue<string> queue = new ConcurrentQueue<string>();
            BlockingCollection<string> blockingCollection = new BlockingCollection<string>();

            var t = new Task[50];
            Console.WriteLine("生產者開始寫入數據.............\r\n");
            
            for(int i=0; i<=49; i++)
            {
                t[i] = Task.Factory.StartNew((param) =>
                {
                    Console.WriteLine("生產者中 *** 阻塞隊列輸入: {0}", param.ToString());
                    blockingCollection.Add(param.ToString());
                    Console.WriteLine("生產者中 *** 阻塞隊列的數量是: {0}", blockingCollection.Count);

                    Console.WriteLine("生產者中 *** 字典dic1輸入: {0}", param.ToString());
                    dic1.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生產者中 *** 字典dic1的數量是: {0}", dic1.Count);

                    Console.WriteLine("生產者中 *** 字典dic2輸入: {0}", param.ToString());
                    dic2.TryAdd(param.ToString(), param.ToString());
                    Console.WriteLine("生產者中 *** 字典dic2的數量是: {0}", dic2.Count);

                    Console.WriteLine("生產者中 *** 隊列輸入: {0}", param.ToString());
                    queue.Enqueue(param.ToString());
                    Console.WriteLine("生產者中 *** 隊列的數量: {0}", queue.Count);
                }, i);
            }
            
            //Thread.Sleep(500);
            Console.WriteLine("\r\n消費者開始讀入數據.............\r\n");

            while (!blockingCollection.IsCompleted)
            {
                Task tt = Task.Factory.StartNew(() =>
                {
                    foreach (var b in blockingCollection.GetConsumingEnumerable())
                    {
                        Console.WriteLine("消費者中 *** 字典dic1的數量是: {0}", dic1.Count);
                        Console.WriteLine("消費者中 *** 字典dic2的數量是: {0}", dic2.Count);

                        Console.WriteLine("消費者中 *** 阻塞隊列的數量是: {0}", blockingCollection.Count);

                        string value1 = "";
                        string value2 = "";
                        dic1.TryGetValue(b, out value1);
                        dic2.TryGetValue(b, out value2);

                        Console.WriteLine("消費者中 *** 字典dic1的鍵值{0}的value值是: {1}", b, value1);
                        Console.WriteLine("消費者中 *** 字典dic1的鍵值{0}的value值是: {1}", b, value2);
                        Console.WriteLine("消費者中 *** 隊列的數量是: {0}", queue.Count);
                        Console.WriteLine("消費者中 *** 字典的數量是: {0}", dic1.Count);

                        if (queue.Count == 50)
                        {
                            blockingCollection.CompleteAdding();
                        }
                    }
                });
            }

            Console.WriteLine("是否完成添加: {0}", blockingCollection.IsCompleted);

參考:

.Net中的並行編程-7.基於BlockingCollection實現高性能非同步隊列


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ABPZero並沒有手機簡訊發送功能,現在我們來集成一個,為後面註冊、登錄作鋪墊。 阿裡雲簡訊服務 首先需要在阿裡雲開通簡訊服務,連接地址 開通後,在簽名管理中添加一個簽名 在模板管理中添加一個模板,如下圖所示 最後需要使用阿裡雲提供的.NET發送簡訊類庫,下麵可以直接下載我上傳的類庫,也可以去官方 ...
  • 本篇內容雜而簡單,不需要多租戶、不需要多語言、使用MPA(多頁面)、頁面載入速度提升…… 剛登錄系統會看到如下界面,這不是最終想要的效果,以下就一一來修改。 不需要多租戶 AbpZeroTemplateConsts.cs代碼修改如下 文件路徑:D:\abp version\aspnet-zero-3 ...
  • 1.新建一個web頁。 2.添加引用,引入htmlagilitypack。 3.代碼 HtmlWeb類是一個從網路上獲取一個HTML文檔的類,其提供的功能大多是基於完成此需求出發。 HtmlDocument類對應著一個HTML文檔代碼。它提供了創建文檔,裝載文檔,修改文檔等等一系列功能。 ...
  • 簡介 SQL註入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統。 根據相關技術原理,SQL註入可以分為平臺層註入和代碼層註入。前者由不安全的 ...
  • 一般一個項目開始之前都會有啟動會,需求交底等等,其中會有一個環節,大講特講項目的意義,然後取一個高大上的項目名字,咱這是一個小功能談不上項目,但是名字不能太小氣了。好吧,就叫Trump吧。沒有任何含義,玩嘛! 項目分層結構也要在這裡說一下,這次這個小功能仿照DDD的分層模式,一定記住我說的是仿照。因... ...
  • 簡介 過多發佈的內容相對比較簡單,因此,我只打算把原文中的一些關鍵信息翻譯一下。原文鏈接如下: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-basic-c ...
  • 簡介 那些通過請求(如查詢字元串和表單數據)指定重定向URL的Web程式可能會被篡改,而把用戶重定向到外部的惡意URL。這種篡改就被稱為開發重定向攻擊。 場景分析 假設有一個正規網站http://nerddinner.com/,還有一個惡意網站或釣魚網站http://nerddiner.com/(註 ...
  • 簡介 CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS非常不同,並且攻擊方式幾乎相左。XSS利 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...