2010-05-20 70 views
4

爲什麼這個鎖定測試不起作用?它拋出一個異常吼叫Console.Write該集合被修改....爲什麼這個鎖定語句不起作用?

static List<string> staticVar = new List<string>(); 

    static void Main(string[] args) 
    { 
     Action<IEnumerable<int>> assyncMethod = enumerator => 
       { 
        lock (staticVar) 
         foreach (int item in enumerator) 
          staticVar.Add(item.ToString()); 


       }; 

     assyncMethod.BeginInvoke(Enumerable.Range(0, 500000), null, null); 
     Thread.Sleep(100); 

     Console.Write(staticVar.Count()); 
     foreach (string item in staticVar) 
     { 

     } 
    } 

回答

5

爲了鎖定若要有效,就必須在一個集合訪問所有情況下使用。無論是閱讀還是寫作。所以,你必須枚舉集合

例如

lock (staticVar) { 
    Console.Write(staticVar.Count()); 
    foreach (string item in staticVar) { 

    } 
} 
+0

只集合或所有類型前加一個鎖? – Alexandre 2010-05-20 17:27:19

+2

鎖的一個要點是,如果鎖在其他地方被鎖定,任何東西都不能進入鎖。如果不在周圍,該鎖可以對大塊代碼沒有影響。鎖必須包裝使用同步變量的每個代碼段。 – Martin 2010-05-20 17:31:42