Почему перечисление через коллекцию вызывает исключение, а циклический просмотр ее элементов не

Я тестировал некоторые конструкции синхронизации и заметил кое-что, что смутило меня. Когда я одновременно перечислял коллекцию во время записи в нее, она выдавала исключение (это ожидалось), но когда я просматривал коллекцию, используя цикл for, это не так. Может кто-нибудь объяснить это? Я думал, что Список не позволяет читателю и писателю работать одновременно. Я ожидал бы, что циклический просмотр коллекции будет демонстрировать то же поведение, что и при использовании перечислителя.

ОБНОВЛЕНИЕ: Это чисто академическое упражнение. Я понимаю, что перечислять список плохо, если он записывается одновременно. Я также понимаю, что мне нужна конструкция синхронизации. Мой вопрос снова был о том, почему операция одна выдает исключение, как ожидалось, а другая - нет.

Код ниже:

   class Program
   {
    private static List<string> _collection = new List<string>();
    static void Main(string[] args)
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(AddItems), null);
        System.Threading.Thread.Sleep(5000);
        ThreadPool.QueueUserWorkItem(new WaitCallback(DisplayItems), null);
        Console.ReadLine();
    }

    public static void AddItems(object state_)
    {
        for (int i = 1; i <= 50; i++)
        {
            _collection.Add(i.ToString());
            Console.WriteLine("Adding " + i);
            System.Threading.Thread.Sleep(150);
        }
    }

    public static void DisplayItems(object state_)
    {
        // This will not throw an exception
        //for (int i = 0; i < _collection.Count; i++)
        //{
        //    Console.WriteLine("Reading " + _collection[i]);
        //    System.Threading.Thread.Sleep(150);
        //}

        // This will throw an exception
        List<string>.Enumerator enumerator = _collection.GetEnumerator();
        while (enumerator.MoveNext())
        {
            string value = enumerator.Current;
            System.Threading.Thread.Sleep(150);
            Console.WriteLine("Reading " + value);
        }
    }
}

Ответы на вопрос(7)

Ваш ответ на вопрос