Я тестировал некоторые конструкции синхронизации и заметил кое-что, что меня смутило. Когда я перебирал коллекцию и одновременно писал в нее, возникало исключение (это было ожидаемо), но когда я просматривал коллекцию с помощью цикла 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);
}
}
}