MSDN смутно упоминает:
ReadOnlyCollection < (Of < (T > ) > ) может поддерживать несколько считывателей одновременно, пока сбор не изменяется. Тем не менее, перечисление через коллекцию по существу не является потокобезопасной процедурой. Чтобы гарантировать безопасность потока во время перечисления, вы можете заблокировать сбор во время всего перечисления. Чтобы обеспечить доступ к коллекции несколькими потоками для чтения и записи, вы должны реализовать свою собственную синхронизацию.
Будет ли безопасен следующий публичный статический сбор для повторения нескольких потоков? Если нет, есть ли что-то встроенное в .NET, которое безопасно? Должен ли я просто отказаться от ReadOnlyCollection
и создать новую копию частной коллекции для каждого доступа к элементу GetString свойства SomeStrings? Я понимаю, что может возникнуть проблема взаимоблокировки, если несколько потоков попытались заблокировать публичный сбор, но это внутренняя библиотека, и я не понимаю, почему мы когда-либо захотим.
public static class WellKnownStrings {
public static readonly ICollection<string> SomeStrings;
static WellKnownStrings()
{
Collection<string> someStrings = new Collection<string>();
someStrings.Add("string1");
someStrings.Add("string2");
SomeStrings = new ReadOnlyCollection<string>(someStrings);
}
}