События синхронизации потоков
В .NET Framework можно также использовать события для синхронизации потоков программы. ManualResetEvent, AutoResetEvent, ManualResetEventSlim и CountdownEvent, которые находятся в пространстве именSystem.Threading.
Классы ManualResetEventSlim и CountdownEvent появились в версии .NET Framework 4.0. Эти классы являются производными от класса EventWaitHandle, находящегося на верхнем уровне иерархии классов, и применяются в тех случаях, когда один поток ожидает появления некоторого события в другом потоке. Как только такое событие появляется, второй поток уведомляет о нем первый поток, позволяя тем самым возобновить его выполнение.
Ниже приведены конструкторы классов ManualResetEvent и AutoResetEvent:
public ManualResetEvent(bool initialState)
public AutoResetEvent(bool initialState)
- где initialState параметр имеет логическое значение true, то о событии первоначально уведомляется.
· Событие ManualResetEvent позволяет потокам взаимодействовать друг с другом путем передачи сигналов. Обычно это взаимодействие касается задачи, которую один поток должен завершить до того, как другой продолжит работу. Когда поток начинает работу, которая должна быть завершена до продолжения работы других потоков, он вызывает метод Reset() для того, чтобы поместить ManualResetEvent в несигнальное состояние. Этот поток можно понимать как контролирующий ManualResetEvent. Потоки, которые вызывают метод WaitOne() в ManualResetEvent, будут заблокированы, ожидая сигнала. Когда контролирующий поток завершит работу, он вызовет метод Set() для сообщения о том, что ожидающие потоки могут продолжить работу.
· Событие AutoResetEvent отличается от события типа ManualResetEvent лишь способом установки в исходное состояние. Если для события типа ManualResetEvent событийный объект остается в сигнальном состоянии до тех пор, пока не будет вызван метод Reset(), то для события типа AutoResetEvent событийный объект автоматически переходит в несигнальное состояние, как только поток, ожидающий это событие, получит уведомление о нем и возобновит свое выполнение. Поэтому если применяется событие типа AutoResetEvent, то вызывать метод Reset() необязательно.
· Событие ManualResetEventSlim переводится в сигнальное состояние вызовом метода Set(), а с помощью Reset() возвращается обратно в несигнальное состояние. В случае вызова метода Set() при наличии множества потоков, ждущих перехода события в сигнальное состояние, ожидание всех этих потоков немедленно прекращается. В случае, если поток просто вызывает метод WaitOne(), а событие уже находится в сигнальном состоянии, ожидавший поток может сразу же продолжить работу.
Дата добавления: 2017-06-02; просмотров: 414;