В 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# позволяют упростить многопоточное программирование, обеспечивая потокобезопасный доступ к данным без явного использования блокировок.