日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

C#中Dictionary與ConcurrentDictionary解鎖多線程操作安全之道

來源: 責編: 時間:2024-04-03 09:10:20 215觀看
導讀使用C#中的Dictionary與ConcurrentDictionary進行多線程操作在C#中,Dictionary是一個常見的字典類型,但它不是線程安全的。為了在多線程環境中確保安全的操作,我們可以使用ConcurrentDictionary,這是一個專門設計用于多線

mQP28資訊網——每日最新資訊28at.com

使用C#中的Dictionary與ConcurrentDictionary進行多線程操作

在C#中,Dictionary是一個常見的字典類型,但它不是線程安全的。為了在多線程環境中確保安全的操作,我們可以使用ConcurrentDictionary,這是一個專門設計用于多線程場景的線程安全字典。mQP28資訊網——每日最新資訊28at.com

1. 使用Dictionary進行非線程安全操作

首先,我們來看一個使用普通的Dictionary的例子。在這個例子中,我們創建一個Dictionary對象,然后通過多個線程同時進行讀取和寫入操作,以演示潛在的線程安全問題。mQP28資訊網——每日最新資訊28at.com

using System;using System.Collections.Generic;using System.Threading;using System.Threading.Tasks;class Program{    static void Main()    {        // 創建一個非線程安全的 Dictionary        Dictionary<int, string> regularDictionary = new Dictionary<int, string>();        // 啟動多個線程對字典進行讀取和寫入操作        List<Task> tasks = new List<Task>();        for (int i = 0; i < 10; i++)        {            int key = i;            tasks.Add(Task.Run(() =>            {                // 讀取和寫入操作                RegularDictionaryExample(regularDictionary, key);            }));        }        // 等待所有任務完成        Task.WaitAll(tasks.ToArray());        Console.WriteLine("Regular Dictionary:");        PrintDictionary(regularDictionary);        Console.ReadLine();    }    // 非線程安全的字典操作示例    static void RegularDictionaryExample(Dictionary<int, string> dictionary, int key)    {        if (dictionary.ContainsKey(key))        {            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} already exists. Value: {dictionary[key]}");        }        else        {            dictionary[key] = $"Value from Thread {Thread.CurrentThread.ManagedThreadId}";            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} added.");        }    }    // 打印字典內容    static void PrintDictionary<T, U>(Dictionary<T, U> dictionary)    {        foreach (var kvp in dictionary)        {            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");        }    }}

2. 使用ConcurrentDictionary進行線程安全操作

接下來,我們使用ConcurrentDictionary來解決線程安全問題。ConcurrentDictionary提供了內置的線程安全機制,避免了多線程同時訪問時的問題。mQP28資訊網——每日最新資訊28at.com

using System;using System.Collections.Concurrent;using System.Threading;using System.Threading.Tasks;class Program{    static void Main()    {        // 創建一個線程安全的 ConcurrentDictionary        ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>();        // 啟動多個線程對字典進行讀取和寫入操作        List<Task> tasks = new List<Task>();        for (int i = 0; i < 10; i++)        {            int key = i;            tasks.Add(Task.Run(() =>            {                // 讀取和寫入操作                ConcurrentDictionaryExample(concurrentDictionary, key);            }));        }        // 等待所有任務完成        Task.WaitAll(tasks.ToArray());        Console.WriteLine("/nConcurrent Dictionary:");        PrintDictionary(concurrentDictionary);        Console.ReadLine();    }    // 線程安全的字典操作示例    static void ConcurrentDictionaryExample(ConcurrentDictionary<int, string> dictionary, int key)    {        string value = dictionary.GetOrAdd(key, k => $"Value from Thread {Thread.CurrentThread.ManagedThreadId}");        Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId}: Key {key} {((value == null) ? "added" : "already exists")}. Value: {value}");    }    // 打印字典內容    static void PrintDictionary<T, U>(ConcurrentDictionary<T, U> dictionary)    {        foreach (var kvp in dictionary)        {            Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");        }    }}
  • Dictionary問題: 普通的Dictionary在多線程環境中可能導致數據不一致或異常,因為它不提供線程安全性。
  • ConcurrentDictionary解決方案: ConcurrentDictionary是專為多線程設計的,通過提供內置的線程安全機制,確保在多線程環境中對字典進行安全的讀取和寫入操作。
  • GetOrAdd方法: ConcurrentDictionaryGetOrAdd方法是線程安全的讀取和寫入的原子操作,可以安全地在多線程環境中使用。

通過選擇適當的字典類型,可以確保在多線程應用程序中有效地管理數據,避免潛在的線程安全問題。mQP28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-81061-0.htmlC#中Dictionary與ConcurrentDictionary解鎖多線程操作安全之道

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Golang VS PHP哪個更適合你?

下一篇: 強大的代碼編輯器組件,你知道幾個?

標簽:
  • 熱門焦點
  • 轎車從天而降電動車主被撞身亡 超速搶道所致:現場視頻讓網友吵翻

    近日,上海青浦區法院判決轎車從天而降電動車主被撞身亡案,轎車車主被判有期徒刑一年。案件顯示當時男子駕駛轎車在上海某路段行駛,前車忽然轉彎提速超車,
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • iQOO Neo8 Pro真機諜照曝光:天璣9200+和V1+旗艦雙芯加持

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
  • iQOO Neo8系列或定檔5月23日:首發天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
Top 主站蜘蛛池模板: 绥宁县| 焦作市| 东乌珠穆沁旗| 小金县| 镇雄县| 潞城市| 富蕴县| 汽车| 靖边县| 阿克陶县| 琼结县| 通化县| 宁明县| 墨江| 临猗县| 三亚市| 琼结县| 墨竹工卡县| 轮台县| 莫力| 报价| 和政县| 康保县| 木里| 互助| 柳州市| 丰都县| 汕头市| 玉山县| 准格尔旗| 大港区| 汽车| 泰州市| 南和县| 旬阳县| 偏关县| 黄冈市| 眉山市| 巢湖市| 河源市| 武清区|