C# ma całkiem niezły model kolekcji, ale klasa ReadOnlyCollection jest jedną z najbardziej niefortunnie wymyślonych (lub nazwanych) klas w całym modelu. Powinien być bardziej odpowiednio nazwany listą tylko do odczytu, a nie tylko do odczytu.
Teraz, aby uzyskać odpowiedź na twoje pytanie, jest to tylko dekorator IList dostarczony w czasie budowy. Dlatego kod, który skonstruował ReadOnlyCollection, może modyfikować oryginalną listę, ze wszystkimi konsekwencjami, jakie będą to mieć dla dostępu wielowątkowego.
Wyliczenie poprzez kolekcję byłoby bezpieczne dla wątków, gdyby kolekcja była naprawdę tylko do odczytu; ale ponieważ nie jest on tylko do odczytu, nie jest bezpieczny dla wątków. Biorąc pod uwagę ilość reputacji, którą posiadam, jestem pewien, że nie zastanawiasz się, dlaczego wyliczanie poprzez kolekcję nie tylko do odczytu nie jest bezpieczne dla wątków.
Jeśli chodzi o obejście, o które prosiłeś, możesz użyć blokady lub możesz przejść do zasady lock-nothing (lub lock-as-little-as-possible) i utworzyć prawdziwą kopię tylko do odczytu listy.
EDIT
ja ponownie czytając moją odpowiedź na wiele miesięcy później (dzięki asyncwait na komentarz) i zdaję sobie sprawę, że powinienem odpowiedział na wszystkie pytania, PO bez dokonywania założenia oparte na jego reputacji. OP prawdopodobnie otrzymał już odpowiedź, ale zrobię to dla dobra przyszłych czytelników.
Wyliczanie przez kolekcję nie do końca tylko do odczytu nie jest samoistnie wątkowane z tych samych powodów, dla których nawet w scenariuszu z jednym wątkiem nie można zmodyfikować kolekcji podczas jej wyliczania. (ConcurrentModificationException w Javie, InvalidOperationException w języku C#.) W scenariuszu jednowątkowym możesz upewnić się, że twój kod wyliczeniowy nie próbuje zmienić kolekcji w żaden sposób, ale w scenariuszu wielowątkowym jeden wątek może wyliczać kolekcję podczas inny wątek może zmieniać go w tym samym czasie.
Och, chłopcze. bezpieczne listy na .NET zbyt długo. Zobacz niektóre wcześniejsze dyskusje tutaj: http://stackoverflow.com/questions/550616/lock -free-stack-and-queue-in-c-sharp i/lub tutaj: http://stackoverflow.com/questions/66622/threadsafe-foreach-enumeration-of-lists – Radu094