Читаем C# 4.0: полное руководство полностью

Применяя методы Add() и Таке(), можно реализовать простой шаблон "поставщик-потребитель", как показано в приведенном ниже примере программы. В этой программе создается поставщик, формирующий символы от А до Z, а также потребитель, получающий эти символы. При этом создается коллекция типа BlockingCollection, ограниченная 4 элементами.


// Простой пример коллекции типа BlockingCollection.

using System;

using System.Threading.Tasks;

using System.Threading;

using System.Collections.Concurrent;


class BlockingDemo {

  static BlockingCollection bc;


  // Произвести и поставить символы от А до Z.

  static void Producer() {

    for(char ch = 'A'; ch <= 'Z'; ch++) {

      bc.Add(ch);

      Console.WriteLine ("Производится символ " + ch) ;

    }

  }


  // Потребить 26 символов,

  static void Consumer() {

    for(int i=0; i < 26; i++)

    Console .WriteLine ("Потребляется символ " + bc.Take());

  }


  static void Main() {

    // Использовать блокирующую коллекцию, ограниченную 4 элементами,

    bc = new BlockingCollection(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 {

      Con.Dispose();

      Prod.Dispose();

      bc.Dispose();

    }

  }

}


Если запустить эту программу на выполнение, то на экране появится смешанный результат, выводимый поставщиком и потребителем. Отчасти это объясняется тем, что коллекция bс ограничена 4 элементами, а это означает, что в нее может быть добавлено только четыре элемента, прежде чем ее придется сократить. В качестве эксперимента попробуйте сделать коллекцию bс неограниченной и понаблюдайте за полученными результатами. В некоторых средах выполнения это приведет к тому, что все элементы коллекции будут сформированы до того, как начнется какое-либо их потребление. Кроме того, попробуйте ограничить коллекцию одним элементом. В этом случае одновременно может быть сформирован лишь один элемент.

Для работы с коллекцией типа BlockingCollection может оказаться полезным и метод CompleteAdding(). Ниже приведена форма его объявления.


public void CompleteAdding()


Вызов этого метода означает, что в коллекцию не будет больше добавлено ни одного элемента. Это приводит к тому, что свойство IsAddingComplete принимает логическое значение true. Если же коллекция пуста, то свойство IsCompleted принимает логическое значение true, и в этом случае вызовы метода Таке() не блокируются. Ниже приведены формы объявления свойств IsAddingComplete и IsCompleted.


public bool IsCompleted { get; }

public bool IsAddingComplete { get; }


Когда коллекция типа BlockingCollection только начинает формироваться, эти свойства содержат логическое значение false. А после вызова метода CompleteAdding() они принимают логическое значение true.

Ниже приведен вариант предыдущего примера программы, измененный с целью продемонстрировать применение метода CompleteAdding(), свойства IsCompleted и метода TryTake().


// Применение методов CompleteAdding(), TryTake()

// и свойства IsCompleted.

using System;

using System.Threading.Tasks;

using System.Threading;

using System.Collections.Concurrent;


class BlockingDemo {

  static BlockingCollection bc;


  // Произвести и поставить символы от А до Z.

  static void Producer() {

    for (char ch = 'A'; ch <= 'Z'; ch++) {

      bc.Add(ch);

      Console.WriteLine("Производится символ " + ch);

    }

    bc.CompleteAdding();

  }


Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных