Список <T> не реализует SyncRoot!
Каждый использует много List. Мне нужно перебрать этот список, поэтому я использую известный SyncRoot шаблон.
Недавно я заметил в этом сообщение о том, что SyncRoot следует избегать в пользу "встроенной" безопасности потоков (каждый метод блокирует частный объект, не подвергая его воздействию используя свойство SyncRoot). Я могу это понять, и частично согласен с этим.
Вопрос в том, что List <T> класс не реализует свойство SyncRoot, даже если реализует ICollection, которые отображают свойство SyncRoot. Я говорю об этом, если код
List<int> list = new List<int>()
list.SyncRoot;
сообщите мне следующую ошибку компилятора:
ошибка CS0117: "System.Collections.Generic.List" не содержит определения для "SyncRoot"
... Если это так, как я могу синхронизировать общедоступное свойство типа List <T> когда он повторяется?
Ответы
Ответ 1
Он фактически реализован явно.
object ICollection.SyncRoot
{
get
{
if (this._syncRoot == null)
{
Interlocked.CompareExchange(ref this._syncRoot, new object(), null);
}
return this._syncRoot;
}
}
Это означает, что вы должны использовать ICollection
для его использования.