public BlockingCollection(IProducerConsumerCollection<T>
int
В двух первых конструкторах в оболочку класса BlockingCollection<T> заключается коллекция, являющаяся экземпляром объекта типа ConcurrentQueue<T>. А в двух других конструкторах можно указать коллекцию, которая должна быть положена в основу коллекции типа BlockingCollection<T>. Если указывается параметр
Помимо методов TryAdd () и TryTake (), определяемых параллельно с теми, что указываются в интерфейсе IProducerConsumerCollection<T>, в классе BlockingCollection<T> определяется также ряд собственных методов. Ниже представлены методы, которые будут использоваться в приведенных далее примерах.
public void Add(T
Когда метод Add () вызывается для неограниченной коллекции, он добавляет элемент
Применяя методы Add () и Таке (), можно реализовать простой шаблон 'поставщик-потребитель', как показано в приведенном ниже примере программы. В этой программе создается поставщик, формирующий символы от А до Z, а также потребитель, получающий эти символы. При этом создается коллекция типа BlockingCollection<T>, ограниченная 4 элементами.
// Простой пример коллекции типа BlockingCollection. using System;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
class BlockingDemo {
static BlockingCollection<char> be;
// Произвести и поставить символы от А до Z. static void Producer () {
for(char ch = 'A'; ch <= 'Z'; ch++) { be.Add(ch);
Console.WriteLine ('Производится символ ' + ch) ;
}
}
// Потребить 26 символов, static void Consumer() {
for(int i=0; i < 26; i++)
Console .WriteLine ('Потребляется символ ' + bc.TakeO);
}
static void Main() {
// Использовать блокирующую коллекцию, ограниченную 4 элементами, be = new BlockingCollection<char>(4);
// Создать задачи поставщика и потребителя.
Task Prod = new Task(Producer);
Task Con = new Task(Consumer);
// Запустить задачи.
Con.Start ();
Prod:Start();
// Ожидать завершения обеих задач, try {
Task.WaitAll(Con, Prod);
} catch(AggregateException exc) {
Console.WriteLine (exc);
} finally {
