- •А.А. Волосевич
- •1. Работа с Числами
- •2. Дата и время
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Отношения равенства и порядка
- •Сравнение для выяснения равенства
- •Сравнение для выяснения порядка
- •6. Жизненный цикл объектов
- •Алгоритм «сборки мусора»
- •Финализаторы и интерфейс iDisposable
- •7. Перечислители и итераторы
- •8. Интерфейсы стандартных коллекций
- •9. Массивы и класс system.Array
- •10. Типы для работы с коллекциями-списками
- •11. Типы для работы с коллекциями-множествами
- •12. Типы для работы с коллекциями-словарями
- •13. Типы для создания пользовательских коллекций
- •14. Технология linq to objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •15. Работа с объектами файЛовой системы
- •16. Ввод и вывод информации
- •Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •Адаптеры потоков
- •17. Основы xml
- •18. Технология linq to xml
- •Создание, сохранение, загрузка xml
- •Запросы, модификация и трансформация xml
- •Пространства имён xml
- •19. ДОполнительные возможности обработки xml
- •20. Сериализация
- •Сериализация времени выполнения
- •Сериализация контрактов данных
- •21. Состав и взаимодействие сборок
- •22. Метаданные и получение информации о типах
- •23. Позднее связывание и кодогенерация
- •24. Динамические типы
- •25. Атрибуты
- •26. Файлы конфигуРации
- •27. Основы мНогопоточноГо программирования
- •28. Синхронизация потоков
- •29. Библиотека параллельных расширений
- •Параллелизм на уровне задач
- •Параллелизм при императивной обработке данных
- •Параллелизм при декларативной обработке данных
- •Обработка исключений и отмена выполнения задач
- •Коллекции, поддерживающие параллелизм
- •30. Асинхронный вызов методов
- •31. Процессы и домены
- •32. Безопасность
- •Разрешения на доступ
- •Изолированные хранилища
- •Криптография
- •33. Диагностика
Коллекции, поддерживающие параллелизм
Библиотека параллельных расширений содержит набор классов, представляющих коллекции с различным уровнем поддержки параллелизма. Указанные классы сосредоточены в пространстве имён System.Collections.Concurrent.
Класс BlockingCollection<T> является реализацией шаблона «поставщик-потребитель»1. Этот класс реализует интерфейсы IEnumerable<T>, ICollection, IDisposable, и имеет собственные элементы, описанные в табл. 21.
Таблица 21
Элементы класса BlockingCollection<T>
Имя элемента |
Описание |
Add() |
Добавляет элемент в коллекцию |
AddToAny() |
Статический метод, который добавляет элемент в любую из указанных BlockingCollection<T> |
CompleteAdding() |
После вызова этого метода добавление элементов невозможно |
GetConsumingEnumerable() |
Возвращает перечислитель, который перебирает элементы с их одновременным удалением из коллекции |
Take() |
Получает элемент и удаляет его из коллекции. Если коллекция пуста, и у коллекции был вызван метод CompleteAdding(), генерируется исключение |
TakeFromAny() |
Статический метод, который получает элемент из любой указанной BlockingCollection<T> |
TryAdd() |
Пытается добавить элемент в коллекцию, в случае успеха возвращает true. Дополнительно может быть задан временной интервал и токен отмены |
TryAddToAny() |
Статический метод, который пытается добавить элемент в любую из указанных коллекций |
TryTake() |
Пытается получить элемент (с удалением из коллекции), в случае успеха возвращает true |
TryTakeFromAny() |
Статический метод, который пытается получить элемент из любой указанной BlockingCollection<T> |
BoundedCapacity |
Свойство возвращает максимальное число элементов, которое можно добавить в коллекцию без блокировки поставщика (данный параметр может быть указан при вызове конструктора BlockingCollection<T>) |
IsAddingCompleted |
Возвращает true, если вызывался CompleteAdding() |
IsCompleted |
Возвращает true, если вызывался CompleteAdding() и коллекция пуста |
Продемонстрируем работу с BlockingCollection<T>, используя десять задач в качестве поставщика и одну в качестве потребителя:
BlockingCollection<int> bc = new BlockingCollection<int>();
for (int producer = 0; producer < 10; producer++)
{
Task.Factory.StartNew(() =>
{
Random rand = new Random();
for (int i = 0; i < 5; i++)
{
Thread.Sleep(200);
bc.Add(rand.Next(100));
}
});
}
var consumer = Task.Factory.StartNew(() =>
{
foreach (var item in bc.GetConsumingEnumerable())
{
Console.WriteLine(item);
}
});
consumer.Wait();
Классы ConcurrentQueue<T>, ConcurrentStack<T>, ConcurrentBag<T> и ConcurrentDictionary<T> ‑ это потокобезопасные классы для представления очереди, стека, неупорядоченного набора объектов и словаря. Предполагается, что данные классы будут использоваться в качестве разделяемых между потоками ресурсов вместо обычных классов-коллекций. Отличительная особенность данных коллекций – наличие Try-методов для получения (изменения) элементов. Такие методы удобны, так как исключают предварительные проверки существования и необходимость использования в клиентском коде секции lock.
// обычный стек Stack<T>
T item;
if (stack.Count > 0) // проверяем наличие элементов
{
item = stack.Pop(); // затем извлекаем элемент
UseData(item);
}
// стек ConcurrentStack<T>
T item;
if (concurrentStack.TryPop(out item)) // пытаемся извлечь элемент
{
UseData(item);
}