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

  // Потреблять символы до тех пор, пока их будет производить поставщик.

  static void Consumer() {

    char ch;

    while(!bc.IsCompleted) {

      if(bc.TryTake(out ch))

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

    }

  }


  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();

    }

  }

}


Этот вариант программы дает такой же результат, как и предыдущий. Главное его отличие заключается в том, что теперь метод Producer() может производить и поставлять сколько угодно элементов. С этой целью он просто вызывает метод CompleteAdding(), когда завершает создание элементов. А метод Consumer() лишь "потребляет" произведенные элементы до тех пор, пока свойство IsCompleted не примет логическое значение true.

Несмотря на специфический до некоторой степени характер параллельных коллекций, предназначенных в основном для параллельного программирования, у них, тем не менее, имеется немало общего с обычными, непараллельными коллекциями, описанными в предыдущих разделах. Если же вам приходится работать в среде параллельного программирования, то для организации одновременного доступа к данным из нескольких потоков вам, скорее всего, придется воспользоваться параллельными коллекциями.


Сохранение объектов, определяемых пользователем классов, в коллекции

Ради простоты приведенных выше примеров в коллекции, как правило, сохранялись объекты встроенных типов, в том числе int, string и char. Но ведь в коллекции можно хранить не только объекты встроенных типов. Достоинство коллекций в том и состоит, что в них допускается хранить объекты любого типа, включая объекты определяемых пользователем классов.

Рассмотрим сначала простой пример применения класса необобщенной коллекции ArrayList для хранения информации о товарных запасах. В этом классе инкапсулируется класс Inventory.


// Простой пример коллекции товарных запасов.

using System;

using System.Collections;


class Inventory {

  string name;

  double cost;

  int onhand;


  public Inventory(string n, double c, int h) {

    name = n;

    cost = c;

    onhand = h;

  }


  public override string ToString() {

    return

        String.Format("{0,-10}Стоимость: {1,6:C} Наличие: {2}",

            name, cost, onhand);

  }

}


class InventoryList {

  static void Main() {

    ArrayList inv = new ArrayList();


    // Добавить элементы в список.

    inv.Add(new Inventory("Кусачки", 5.95, 3));

    inv.Add(new Inventory("Отвертки", 8.29, 2));

    inv.Add(new Inventory("Молотки", 3.50, 4));

    inv.Add(new Inventory("Дрели", 19.88, 8));


    Console.WriteLine("Перечень товарных запасов:");

    foreach(Inventory i in inv) {

      Console.WriteLine(" " + i);

    }

  }

}


При выполнении программы из данного примера получается следующий результат.


Перечень товарных запасов:

 Кусачки   Стоимость:  $5,95 Наличие: 3

 Отвертки  Стоимость:  $8,29 Наличие: 2

 Молотки   Стоимость:  $3,50 Наличие: 4

 Дрели     Стоимость: $19,88 Наличие: 8


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

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

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

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

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

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

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

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

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