У меня есть коллекция, как показано ниже?Является ли ICollection <>. Добавить() потокобезопасным?
public ICollection<MyClass> Property { get; private set; }
...
Property = new List<MyClass>();
Я хотел бы добавить MyClass
элементы в Property
после загрузки каждого MyClass
элемента из БД. Теперь каждый выборка DB обрабатывается отдельными фоновыми потоками, и они запускаются одновременно. Таким образом, каждое возвращаемое значение из вызова БД встречается Property.Add()
. Теперь это может привести к условиям гонки, так как Property.Add()
можно назвать несколько раз в одно мгновение.
Так что мой вопрос: List<>.Add()
или любой другой класс, реализующий ICollection<>.Add()
, внутренне обрабатывать любые условия гонки или он должен быть явно обработан? Если да, то как?
'ICollection' это интерфейс. Конкретная реализация этого интерфейса может быть потокобезопасной, а может и не быть, но на самом деле не имеет смысла говорить о безопасности потоков самого интерфейса. Вопрос должен состоять в том, является ли 'List .Add()' потокобезопасным. –
hvd
В классах коллекции в System.Collections.Generic не предусмотрена ни одна синхронизация потоков; код пользователя должен обеспечивать всю синхронизацию при добавлении или удалении элементов одновременно. Если вам нужно обеспечить безопасность потока в пространстве имен 'System.Collections.Concurrent'. http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx –
Список не является потокобезопасным. Это упоминается в разделе «Безопасность потока» в документации [класс] (http://msdn.microsoft.com/en-us/library/6sh2ey19 (v = vs.110) .aspx). Этот раздел присутствует в документации по ** всем ** .NET-классам –