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

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

    // Уведомить о событии,

    mre.Set();

  }

}

class ManualEventDemo {

  static void Main() {

    ManualResetEvent evtObj = new ManualResetEvent(false);

    MyThread mt1 = new MyThread("Событийный Поток 1", evtObj);

    Console.WriteLine("Основной поток ожидает событие.");

    // Ожидать уведомления о событии.

    evtObj.WaitOne();

    Console.WriteLine("Основной поток получил " +

             "уведомление о событии от первого потока.");

    // Установить событийный объект в исходное состояние.

    evtObj.Reset();

    mt1 = new MyThread("Событийный Поток 2", evtObj);

    // Ожидать уведомления о событии.

    evtObj.WaitOne();

    Console.WriteLine("Основной поток получил " +

         "уведомление о событии от второго потока.");

  }

}

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

Внутри потока Событийный Поток 1

Событийный Поток 1

Основной поток ожидает событие.

Событийный Поток 1

Событийный Поток 1

Событийный Поток 1

Событийный Поток 1

Событийный Поток 1 завершен!

Основной поток получил уведомление о событии от первого потока.

Внутри потока Событийный Поток 2

Событийный Поток 2

Событийный Поток 2

Событийный Поток 2

Событийный Поток 2

Событийный Поток 2

Событийный Поток 2 завершен!

Основной поток получил уведомление о событии от второго потока.

Прежде всего обратите внимание на то, что событие типа ManualResetEvent передается непосредственно конструктору класса MyThread. Когда завершается метод Run() из класса MyThread, он вызывает для событийного объекта метод Set(), устанавливающий этот объект в сигнальное состояние. В методе Main() формируется событийный объект evtObj типа ManualResetEvent, первоначально устанавливаемый в исходное, несигнальное состояние. Затем создается экземпляр объекта типа MyThread, которому передается событийный объект evtObj. После этого основной поток ожидает уведомления о событии. А поскольку событийный объект evtObj первоначально находится в несигнальном состоянии, то основной поток вынужден ожидать до тех пор, пока для экземпляра объекта типа MyThread не будет вызван метод Set() устанавливающий событийный объект evtObj в сигнальное состояние. Это дает возможность основному потоку возобновить свое выполнение. Затем событийный объект устанавливается в исходное состояние, и весь процесс повторяется, но на этот раз для второго потока. Если бы не событийный объект, то все потоки выполнялись бы одновременно, а результаты их выполнения оказались бы окончательно запутанными. Для того чтобы убедиться в этом, попробуйте закомментировать вызов метода WaitOne() в методе Main().

Если бы в рассматриваемой здесь программе событийный объект типа AutoResetEvent использовался вместо событийного объекта типа ManualResetEvent, то вызывать метод Reset() в методе Main() не пришлось бы. Ведь в этом случае событийный объект автоматически устанавливается в несигнальное состояние, когда поток, ожидающий данное событие, возобновляет свое выполнение. Для опробования этой разновидности события замените в данной программе все ссылки на объект типа ManualResetEvent ссылками на объект типа AutoResetEvent и удалите все вызовы метода Reset(). Видоизмененная версия программы будет работать так же, как и прежде.

<p>Класс Interlocked</p>
Перейти на страницу:

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

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

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

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

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

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

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

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