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

Зачастую в многопоточной программе требуется, чтобы основной поток был последним потоком, завершающим ее выполнение. Формально программа продолжает выполняться до тех пор, пока не завершатся все ее приоритетные потоки. Поэтому требовать, чтобы основной поток завершал выполнение программы, совсем не обязательно. Тем не менее этого правила принято придерживаться в многопоточном программировании, поскольку оно явно определяет конечную точку программы. В рассмотренной выше программе предпринята попытка сделать основной поток завершающим ее выполнение. Для этой цели значение переменной Count проверяется в цикле do-while внутри метода Main(), и как только это значение оказывается равным 10, цикл завершается и происходит поочередный возврат из методов Sleep(). Но такой подход далек от совершенства, поэтому далее в этой главе будут представлены более совершенные способы организации ожидания одного потока до завершения другого.

Простые способы усовершенствования многопоточной программы

Рассмотренная выше программа вполне работоспособна, но ее можно сделать более эффективной, внеся ряд простых усовершенствований, во-первых, можно сделать так, чтобы выполнение потока начиналось сразу же после его создания. Для этого достаточно получить экземпляр объекта типа Thread в конструкторе класса MyThread. И во-вторых, в классе MyThread совсем не обязательно хранить имя потока, поскольку для этой цели в классе Thread специально определено свойство Name.

public string Name { get; set; }

Свойство Name доступно для записи и чтения и поэтому может служить как для запоминания, так и для считывания имени потока.

Ниже приведена версия предыдущей программы, в которую внесены упомянутые выше усовершенствования.

// Другой способ запуска потока.

using System;

using System.Threading;

class MyThread {

  public int Count;

  public Thread Thrd;

  public MyThread(string name) {

    Count = 0;

    Thrd = new Thread(this.Run);

    Thrd.Name = name; // задать имя потока

    Thrd.Start(); // начать поток

  }

  // Точка входа в поток,

  void Run() {

    Console.WriteLine(Thrd.Name + " начат.");

    do {

      Thread.Sleep(500);

      Console.WriteLine("В потоке " + Thrd.Name + ", Count = " + Count);

      Count++;

    } while (Count < 10);

    Console.WriteLine(Thrd.Name + " завершен.");

  }

}

class MultiThreadlmproved {

  static void Main() {

    Console.WriteLine("Основной поток начат.");

    // Сначала сконструировать объект типа MyThread.

    MyThread mt = new MyThread("Потомок #1");

    do {

      Console.Write(".");

      Thread.Sleep(100);

    } while (mt.Count != 10);

    Console.WriteLine("Основной поток завершен.");

  }

}

Эта версия программы дает такой же результат, как и предыдущая. Обратите внимание на то, что объект потока сохраняется в переменной Thrd из класса MyThread.

Создание нескольких потоков

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

using System;

using System.Threading;

class MyThread {

  public int Count;

  public Thread Thrd;

  public MyThread(string name) {

    Count = 0;

    Thrd = new Thread(this.Run);

    Thrd.Name = name;

    Thrd.Start() ;

  }

  // Точка входа в поток,

  void Run() {

    Console.WriteLine(Thrd.Name + " начат.");

    do {

      Thread.Sleep (500);

      Console.WriteLine("В потоке " + Thrd.Name + ", Count = " + Count);

      Count++;

    } while(Count < 10);

    Console.WriteLine(Thrd.Name + " завершен.");

  }

}

class MoreThreads {

  static void Main() {

    Console.WriteLine("Основной поток начат.");

    // Сконструировать три потока.

    MyThread mt1 = new MyThread("Потомок #1");

    MyThread mt2 = new MyThread("Потомок #2");

    MyThread mt3 = new MyThread("Потомок #3");

    do {

      Console.Write(".");

      Thread.Sleep(100) ;

    } while (mt1.Count <10 ||

             mt2.Count <10 ||

             mt3.Count < 10);

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

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