Безопасно ли добавлять и удалять элементы из объекта List? - PullRequest
1 голос
/ 01 апреля 2020

Предположим, у нас есть несколько потоков и публикация c List, которая отвечает за хранение данных в реальном времени. У нас есть какой-то поток, который отвечает за добавление данных в список объектов. Другой поток отвечает за получение данных из объекта списка и затем удаление элементов сверху.

Вопрос: Безопасно ли удалять из начала List и одновременно добавлять данные в конец списка в отдельных потоках? Как реализован List объект?

Ответы [ 2 ]

4 голосов
/ 01 апреля 2020

Начиная с документов :

Publi c stati c члены этого типа являются поточно-ориентированными. Любые члены экземпляра не гарантируют , чтобы быть потокобезопасными.

Безопасно выполнять несколько операций чтения в списке, но могут возникнуть проблемы, если коллекция будет изменена во время чтения.

Итак, если ваша коллекция может быть изменена некоторыми потоками - вам нужно заблокировать ее при записи и операции чтения.

Документы также указывают на другое решение:

Для коллекций со встроенной синхронизацией см. Классы в пространстве имен System.Collections.Concurrent .

Например ConcurrentQueue , например. Используйте .Enqueue(obj), чтобы вставить его в конец очереди, и TryDequeue(out obj), чтобы получить его из верхней части очереди.

2 голосов
/ 01 апреля 2020

Список не является потокобезопасным.

Проблема, которую вы решаете, выглядит как проблема производителя-потребителя, поэтому вам нужна коллекция, которая реализует IProducerConsumerCollection<T>:

Если вам также нужно ограниченный буфер (разрешить только определенное количество элементов в коллекции за все время), вы можете использовать BlockingCollection<T>, с любым из вышеперечисленного в качестве внутренней коллекции.

...