在之前一段時間裡面,我的基類多數使用lock和Hashtable組合實現多線程內緩存的衝突處理,不過有時候使用這兩個搭配並不盡如人意,偶爾還是出現了集合已經加入的異常,對程式碼做多方的處理後依然如故,最後採用了.NET 4.0後才引入的ConcurrentDictionary多線程同步字典集合,問題順利解決。
1、使用lock和Hashtable組合實作
在我的基底類別裡面,建構業務對象,一般用BLLFactory
var result = BLLFactory<customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson());</customer>
因此使用BLLFactory
HashTable表示鍵/值對的集合。在.NET Framework中,Hashtable是System.Collections命名空間提供的一個容器,用於處理和表現類似key-value的鍵值對,其中key通常可用於快速查找,同時key是區分大小寫;value用於儲存對應於key的值。 Hashtable中key-value鍵值對均為object型,所以Hashtable可以支援任何型別的keyvalue鍵值對,任何非 null 物件都可以當作鍵或值。
使用這種方式,偶爾在Web端,還是出現多執行緒存取衝突的問題,為此我們也可以使用多執行緒的測試程式碼來進行測試重現錯誤,
try{ List<thread> list = new List<thread>();for (int i = 0; i {var result = BLLFactory<customer>.Instance.FindFirst(); Console.WriteLine(result.ToJson()); Console.WriteLine(); }); list.Add(thread); }for (int i = 0; i </customer></thread></thread>
追蹤程式碼得到錯誤訊息如下所示。
因此,從上面程式碼可以看到,使用lock(syncRoot)也無法出現的多執行緒衝突問題。
2、使用ConcurrentDictionary取代Hashtable
ConcurrentDictionary是.net4.0推出的一套執行緒安全集合裡的其中一個,和它一起被發行的還有ConcurrentStack,ConcurrentQueue等類型,它們的單線程版本(線程不安全的,Queue,Stack,Dictionary)我們一定不會陌生。 ConcurrentDictionaryTKey, TValue> 可由多個執行緒同時訪問,且執行緒安全,用法同Dictionary很多相同,但是多了一些方法。 ConcurrentDictionary 屬於System.Collections.Concurrent 命名空間。
System.Collections.Concurrent 命名空間提供多個執行緒安全集合類別。當有多個執行緒並發存取集合時,應使用這些類別來取代 System.Collections 和 System.Collections.Generic 命名空間中的對應類型。
ConcurrentDictionary這個類別提供了下面幾個方法,用於對集合的處理
public bool TryAdd(TKey key, TValue value)public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)public TValue this[TKey key] { get; set; }public TValue AddOrUpdate(TKey key, Func<tkey> addValueFactory, Func<tkey> updateValueFactory) public TValue AddOrUpdate(TKey key, TValue addValue, Func<tkey> updateValueFactory)public TValue GetOrAdd(TKey key, TValue value)public TValue GetOrAdd(TKey key, Func<tkey> valueFactory)</tkey></tkey></tkey></tkey>
使用ConcurrentDictionary來取代Hashtable,讓我們來看看BLLFactory的類別的實作程式碼如下所示。
/// <summary>/// 对业务类进行构造的工厂类/// </summary>/// <typeparam>业务对象类型</typeparam>public class BLLFactory<t> where T : class{//采用ConcurrentDictionary线程安全的集合类来缓存,替代Hashtableprivate static ConcurrentDictionary<string> conCurrentCache = new ConcurrentDictionary<string>(); /// <summary>/// 创建或者从缓存中获取对应业务类的实例/// </summary>public static T Instance {get{string CacheKey = typeof(T).FullName;return (T)conCurrentCache.GetOrAdd(CacheKey, s =>{var bll = Reflect<t>.Create(typeof(T).FullName, typeof(T).Assembly.GetName().Name); //反射创建,并缓存return bll; }); } } }</t></string></string></t>
我們可以看到程式碼簡化了很多,而且使用前面的多執行緒測試程式碼,也順利取得數據,不會出現異常了。
執行程式碼可以順利實現,不會出現先前使用Hashtable出現的多執行緒存取異常了。
以上就是引入ConcurrentDictionary替代Hashtable對多執行緒的物件快取處理,能夠順利解決問題的時候,發現其存取效率也是較之前有所提高,一舉兩得。
以上是使用ConcurrentDictionary多執行緒同步字典集合實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C#是微軟在2000年發布的編程語言,旨在結合C 的強大功能和Java的簡潔性。 1.C#是一種類型安全、面向對象的編程語言,支持封裝、繼承和多態。 2.C#的編譯過程將代碼轉化為中間語言(IL),然後在.NET運行時環境(CLR)中即時編譯成機器碼執行。 3.C#的基本用法包括變量聲明、控制流和函數定義,而高級用法涵蓋異步編程、LINQ和委託等。 4.常見錯誤包括類型不匹配和空引用異常,可通過調試器、異常處理和日誌記錄來調試。 5.性能優化建議包括使用LINQ、異步編程和提高代碼可讀性。

C#是一種編程語言,而.NET是一個軟件框架。 1.C#由微軟開發,適用於多平台開發。 2..NET提供類庫和運行時環境,支持多語言。兩者協同工作,構建現代應用。

C#.NET是一個強大的開發平台,結合了C#語言和.NET框架的優勢。 1)它廣泛應用於企業應用、Web開發、遊戲開發和移動應用開發。 2)C#代碼編譯成中間語言後由.NET運行時環境執行,支持垃圾回收、類型安全和LINQ查詢。 3)使用示例包括基本控制台輸出和高級LINQ查詢。 4)常見錯誤如空引用和類型轉換錯誤可以通過調試器和日誌記錄解決。 5)性能優化建議包括異步編程和優化LINQ查詢。 6)儘管面臨競爭,C#.NET通過不斷創新保持其重要地位。

C#.NET的未來趨勢主要集中在雲計算、微服務、AI和機器學習集成以及跨平台開發三個方面。 1)雲計算和微服務:C#.NET通過Azure平台優化雲環境表現,支持構建高效微服務架構。 2)AI和機器學習集成:借助ML.NET庫,C#開發者可在應用中嵌入機器學習模型,推動智能化應用發展。 3)跨平台開發:通過.NETCore和.NET5 ,C#應用可在Windows、Linux和macOS上運行,擴展部署範圍。

C#.NET開發的最新動態和最佳實踐包括:1.異步編程提高應用響應性,使用async和await關鍵字簡化非阻塞代碼;2.LINQ提供強大查詢功能,通過延遲執行和表達式樹高效操作數據;3.性能優化建議包括使用異步編程、優化LINQ查詢、合理管理內存、提升代碼可讀性和維護性、以及編寫單元測試。

如何利用.NET構建應用?使用.NET構建應用可以通過以下步驟實現:1)了解.NET基礎知識,包括C#語言和跨平台開發支持;2)學習核心概念,如.NET生態系統的組件和工作原理;3)掌握基本和高級用法,從簡單控制台應用到復雜的WebAPI和數據庫操作;4)熟悉常見錯誤與調試技巧,如配置和數據庫連接問題;5)應用性能優化與最佳實踐,如異步編程和緩存。

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

C#和.NET適用於Web、桌面和移動開發。 1)在Web開發中,ASP.NETCore支持跨平台開發。 2)桌面開發使用WPF和WinForms,適用於不同需求。 3)移動開發通過Xamarin實現跨平台應用。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器