Конкурентные коллекции в C#

В C# конкурентные коллекции из пространства имен System.Collections.Concurrent обеспечивают потокобезопасную работу с данными в многопоточной среде без необходимости вручную синхронизировать доступ к ним.

Основные конкурентные коллекции

ConcurrentDictionary<TKey, TValue>

Это потокобезопасная реализация словаря (Dictionary<TKey, TValue>). Обеспечивает безопасное добавление, удаление и обновление элементов без явной блокировки.

Пример использования:

var dictionary = new ConcurrentDictionary<int, string>();

dictionary.TryAdd(1, "Value1");
dictionary.TryUpdate(1, "UpdatedValue", "Value1");
dictionary.TryRemove(1, out var removedValue);

ConcurrentQueue<T>

Потокобезопасная очередь, работающая по принципу FIFO (First In, First Out). Позволяет нескольким потокам безопасно добавлять и извлекать элементы.

Пример использования:

var queue = new ConcurrentQueue<int>();

queue.Enqueue(1);
queue.Enqueue(2);
queue.TryDequeue(out int result);

ConcurrentStack<T>

Потокобезопасный стек, работающий по принципу LIFO (Last In, First Out). Подходит для сценариев, где последние добавленные элементы должны обрабатываться первыми.

Пример использования:

var stack = new ConcurrentStack<int>();

stack.Push(1);
stack.Push(2);
stack.TryPop(out int result);

ConcurrentBag<T>

Неупорядоченная коллекция, оптимизированная для частого добавления и извлечения элементов разными потоками. Лучше всего подходит для независимых данных.

Пример использования:

var bag = new ConcurrentBag<int>();

bag.Add(1);
bag.Add(2);
bag.TryTake(out int result);

BlockingCollection<T>

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

Пример использования:

var blockingCollection = new BlockingCollection<int>(new ConcurrentQueue<int>(), 5);
blockingCollection.Add(1);
int item = blockingCollection.Take();

Выбор подходящей коллекции

КоллекцияОсобенностиПодходящие сценарии
ConcurrentDictionary<TKey, TValue>Потокобезопасный словарьКэширование данных, частые обновления
ConcurrentQueue<T>FIFO, потокобезопасностьОчередь задач, логирование
ConcurrentStack<T>LIFO, потокобезопасностьАлгоритмы обработки последних данных
ConcurrentBag<T>Неупорядоченная коллекцияНезависимые элементы, параллельная обработка
BlockingCollection<T>Ограничение по размеру, блокировкаОчереди задач с контролем потока

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