Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

В приведенном ниже примере программы демонстрируется применение события типа ManualResetEvent.

// Использовать событийный объект, устанавливаемый // в исходное состояние вручную.

using System;

using System.Threading;

// Этот поток уведомляет о том, что событие передано его конструктору, class MyThread {

public Thread Thrd;

ManualResetEvent mre;

public MyThread(string name, ManualResetEvent evt) {

Thrd = new Thread(this.Run);

Thrd.Name = name; ,

mre = evt;

Thrd.Start;

}

//

Точка входа в поток, void Run {

Console.WriteLine("Внутри потока " + Thrd.Name);

for(int i=0; i<5; i++) {

Console.WriteLine(Thrd.Name);

Thread.Sleep(500) ;

}

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

// Уведомить о событии, mre.Set;

class ManualEventDemo { static void Main {

ManualResetEvent evtObj = new ManualResetEvent(false);

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

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

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

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

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

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

mtl = 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 . Видоизмененная версия программы будет работать так же, как и прежде.

Класс Interlocked

Еще одним классом, связанным с синхронизацией, является класс Interlocked. Этот класс служит в качестве альтернативы другим средствам синхронизации, когда требуется только изменить значение общей переменной. Методы, доступные в классе Interlocked, гарантируют, что их действие будет выполняться как единая, непрерываемая операция. Это означает, что никакой синхронизации в данном случае вообще не требуется. В классе Interlocked предоставляются статические методы для сложения двух целых значений, инкрементирования и декрементирования целого значения, сравнения и установки значений объекта, обмена объектами и получения 64-разрядно-го значения. Все эти операции выполняются без прерывания.

В приведенном ниже примере программы демонстрируется применение двух методов из класса Interlocked: Increment () и Decrement . При этом используются следующие формы обоих методов:

public static int Increment(ref int location) public static int Decrement(ref int location)

где location — это переменная, которая подлежит инкрементированию или декрементированию.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Плохой парень, Купидон и я

Уильямс Хасти
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Плохой парень, Купидон и я

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Надуй щеки! Том 3

Вишневский Сергей Викторович
3. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 3

Русь. Строительство империи

Гросов Виктор
1. Вежа. Русь
Фантастика:
альтернативная история
рпг
5.00
рейтинг книги
Русь. Строительство империи

Фею не драконить!

Завойчинская Милена
2. Феями не рождаются
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Фею не драконить!

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Убивать чтобы жить 9

Бор Жорж
9. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 9

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2