![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Коллекции, поддерживающие параллелизм
Библиотека параллельных расширений содержит набор классов, представляющих коллекции с различным уровнем поддержки параллелизма. Указанные классы сосредоточены в пространстве имён System.Collections.Concurrent. Класс BlockingCollection< T> является реализацией шаблона «поставщик-потребитель». Этот класс реализует интерфейсы IEnumerable< T>, ICollection, IDisposable и имеет собственные элементы, описанные в табл. 21. Таблица 21 Элементы класса BlockingCollection< T>
Продемонстрируем работу с 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. // используем объект типа ConcurrentStack< T> T item; if (concurrentStack.TryPop(out item)) // пытаемся извлечь элемент { UseData(item); }
|