Почему нет ConcurrentList<T>
Новое пространство имен System.Collections.Concurrent содержит параллельные коллекции для словаря, очереди и стека среди других классов. Кто-нибудь знает, почему не существует ConcurrentList?
ОБНОВИТЬ
Я опубликовал новый вопрос, объясняющий мой текущий сценарий. Я предпочел это изменению всего смысла исходного вопроса. Вот ссылка на новый вопрос.
3 ответа
Произвольный доступ не имеет большого смысла для структуры данных, которая изменилась из другого потока.
Если вы посмотрите на параллельные коллекции, вы заметите, что их интерфейс специально разработан для работы с многопоточным доступом. Я не могу придумать полезного списка-подобного интерфейса, который хорошо работает с многопоточным кодом.
Случайный многопоточный доступ может иметь смысл, если элементы никогда не перемещаются, но тогда у вас есть массив.
Если бы две темы добавили элементы одновременно, чего бы вы ожидали от "заказа"? ConcurrentBag более уместен, если все, что вам нужно, это набор элементов.
Еще в 2011 году я написал ConcurrentList<T>
класс (код доступен на GitHub), который является потокобезопасным, без блокировки и реализует некоторые из IList<T>
интерфейс.
Примечательно, что любые операции, которые изменяют список, кроме Add
не поддерживаются; т.е. это коллекция только для добавления. Так Insert
, RemoveAt
и т.д. не работают.