Dlaczego SynchronizedCollection<T>
nie nabywa blokadę na SyncObj w wyraźnej realizacji IEnumerable.GetEnumerator()
Dlaczego SynchronizedCollection <T> nie blokuje na IEnumerable.GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
{
return this.items.GetEnumerator();
}
niejawnego realizacji ma nabyć blokadę SyncOb (zweryfikowane przez reflektor).
Może to być problem podczas pętli foreach w tej kolekcji. Jeden wątek mógł uzyskać blokadę, a drugi mógł próbować odczytać go za pomocą foreach?
Myślę, że to, o czym on mówi, to fakt, że niejawna implementacja GetEnumerator() rzeczywiście wywołuje blokadę. – user7116
Rzeczywiście tak. Głupie, nie ma niczego, co trzeba zablokować. Wewnętrzne odwołanie do listy nie może się zmienić, a jedynie zawartość. Iterator zapisuje tylko odwołanie do listy. –
Wierzę, że powinno, ponieważ wywołanie 'GetEnumerator()' ostatecznie tworzy nowy 'Enumerator', który opiera się na polu 'List ._version'. –
user7116