Когда я использую SynchronizedCollection
, я могу поймать исключение
System.InvalidOperationException
Collection was modified; enumeration operation may not execute.
в foreach
цикле.
Если вы посмотрите на исходный код класса SynchronizedCollection, а именно в GetEnumeratorметод (есть два из них, на самом деле один является явной реализацией интерфейса), вы увидите это:
List<T> items;
IEnumerator IEnumerable.GetEnumerator()
{
return ((IList)this.items).GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
lock (this.sync)
{
return this.items.GetEnumerator();
}
}
Возвращает перечислитель внутреннего List, который не является потокобезопасным !
Правка.Я не спрашиваю, что я могу сделать в параллельных ситуациях.Я спрашиваю
Как сделать потокобезопасным?