2013-07-14 94 views
0

我有以下代碼:使用任務(TPL)內的通用字典

Dictionary<string, WSResponse> responseDictionary = new Dictionary<string, WSResponse>(); 
List<Task> taskList = new List<Task>(); 
      foreach (string ID in IDs) 
      { 
       string localID = ID; 

       Task newTask = Task.Factory.StartNew(() => 
       { 
        WSResponse response = Query.GetListFor(localID);      
        responseDictionary.Add(localID, response); 
       }); 
       taskList.Add(newTask); 
      } 


      Task.WaitAll(taskList.ToArray()); 

我應該在這種情況下使用的ConcurrentDictionary而不是Dictionary?即使我確定密鑰不會在邏輯層面上重複?

回答

2

ConcurrentDictionary和鎖定不可互換或等效。

添加鎖定會強制所有任務按順序寫入字典,實質上否定了您可能從併發處理中獲得的任何好處。如果超過兩個線程試圖同時寫入它,Dictionary類也會拋出一個有點神祕的異常。這是因爲解鎖訪問會破壞其內部結構。

另一方面,A ConcurrentDictionary允許所有任務同時寫入詞典,無需任何鎖定。與未鎖定的同步版本相比,懲罰是較慢的同步性能。但在併發情況下,性能和可伸縮性要好得多。

+0

很好的答案。謝謝! –

1

你應該使用syncronization,是的。一個簡單的lock就足夠了。

+0

在這種情況下,使用鎖定或使用「ConcurrentDictionary」是可以互換的嗎?兩種方法都有優點/缺點嗎? –