2010-05-20 7 views
4

pourquoi ce test de verrouillage ne fonctionne pas? il est lancer une exception beugler Console.Write cette collection a été modifié ....Pourquoi cette instruction de verrouillage ne fonctionne pas?

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) 
     { 

     } 
    } 

Répondre

5

Pour qu'un verrou soit efficace, il doit être utilisé dans tous les cas qu'une collection est accédée. Que ce soit en train de lire ou d'écrire. Vous devez donc ajouter un verrou avant la collection énumérer

Par exemple

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

    } 
} 
+0

uniquement à la collecte ou tous les types? – Alexandre

+2

Le point d'un verrou est que rien ne peut entrer dans la serrure si elle est tenue ailleurs. Le verrou peut n'avoir aucun effet sur un morceau de code s'il n'est pas autour de lui. Un verrou doit entourer chaque section de code qui utilise une variable synchronisée. – Martin

Questions connexes