国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C# 的 Dictionary 寫入前應注意事項

2019-11-17 02:18:24
字體:
來源:轉載
供稿:網友
C# 的 Dictionary 寫入前應注意事項

一個已上線、用戶龐大的系統,幾個月來第一次出現這個系統錯誤訊息 :「已經加入含有相同索引鍵的項目」「已添加了具有相同鍵的項」An item with the same key has already been added.

----------------------------------------------------------------------------分析原因:

C# 的 Dictionary 這種資料結構的變數,若宣告為 static,在使用上,要注意寫入或 Add 資料前,只做 if ContainsKey 判斷是不夠的 (如下圖 2),因其不是「執行緒 ; 線程」(thread)安全的。由於 Dictionary 的 Key 不能重複,若剛好有兩人或多人,同時進入 if 區塊、同時 Add 同一個 Key,就會引發錯誤。機率不高,但久久偶爾會發生一次。

因此在 Dictionary 寫入或 Add 前,應多做一個 lock 的動作,如下圖 3,以達到一次只有一個人 (一個執行緒),能進入 lock 區塊中,其他人要排隊等候。

圖 1 宣告 Dictionary 變數

圖 2 改寫前 (久久偶爾會發生一次錯誤的寫法)

圖 3 改寫後

C# 的 lock,但注意一定要是宣告為 static 的變數,才有鎖定的結果 (經我自己實測)。(static 變數,表示全網站的所有用戶,共用同一塊「記憶體 ; 內存」(memory),而不是每個用戶各自 new 一塊記憶體)。

-------------------------------------------------------------------Dictionary 介紹 (msdn) :https://msdn.microsoft.com/zh-tw/library/xfhwa508(v=vs.110).aspx-------------------------------------------------------------------詳細說明 Dictionary 問題的文章 (推薦好文,臺灣極資深專家-李明儒先生):http://blog.darkthread.net/post-2012-01-31-dictionary-thread-safe.aspx

以下引用該文的內容:Dictionary<TKey, TValue>在多執行緒下,「讀取」沒問題;但若打算在多個執行緒中同時「更新」,就必須自行處理鎖定及同步議題上文中,還提到 .NET 4.0 加入一種新的 System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>。但我爬文後,覺得不見得能解決此問題,建議勿用。-------------------------------------------------------------------lock 介紹 :http://www.dotblogs.com.tw/yc421206/archive/2011/01/07/20624.aspxhttps://msdn.microsoft.com/zh-tw/library/c5kehkcz.aspx-------------------------------------------------------------------ConcurrentDictionary<TKey, TValue> 類別 :https://msdn.microsoft.com/zh-tw/library/dd287191(v=vs.110).aspx

ConcurrentDictionary<TKey, TValue>.GetOrAdd 方法 (TKey, TValue) :https://msdn.microsoft.com/zh-tw/library/ee378674(v=vs.110).aspx

Dictionary + Locking versus ConcurrentDictionaryhttp://www.codePRoject.com/Articles/548406/Dictionary-plus-Locking-versus-ConcurrentDictionar-------------------------------------------------------------------ConcurrentDictionary 讓你的多線程代碼更優美http://www.bkjia.com/C_jc/968538.html

以下引用該文的內容 (非我本人的觀點):用 Dictionary,而當這個屬性被提升為 static 靜態的(類級別的)時候,我們就要考慮它的線程安全性了,因為它有可能被多個線程同時訪問,當然,如果這個對象是只讀的,也無所謂線程安全,但如果這個屬性是可以被寫的,那就需要把它加鎖了。但從性能上看,就不能被接收,我們知道,lock 會把其它線程鎖在外面,無論是讀還是寫,都會被鎖,性能非常差。

-------------------------------------------------------------------


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萨迦县| 皋兰县| 台北县| 兴海县| 清水河县| 江阴市| 神木县| 永嘉县| 犍为县| 花莲市| 吉首市| 周至县| 花莲县| 六枝特区| 全南县| 龙海市| 正安县| 梨树县| 昂仁县| 曲阜市| 香格里拉县| 隆尧县| 云龙县| 清苑县| 本溪| 抚顺市| 茂名市| 平乐县| 日土县| 荔浦县| 东至县| 霍林郭勒市| 高青县| 四子王旗| 芜湖县| 日喀则市| 康平县| 双峰县| 莒南县| 成都市| 五华县|