Почему этот оператор блокировки не работает? - PullRequest
4 голосов
/ 20 мая 2010

почему этот тест блокировки не работает? Это вызывает исключение ниже 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)
        {

        }
    }

1 Ответ

5 голосов
/ 20 мая 2010

Чтобы блокировка была эффективной, она должна использоваться во всех случаях доступа к коллекции.Будь то чтение или письмо.Таким образом, вы должны добавить блокировку перед перечислением коллекции

Например

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

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...