возврат из метода
Wait One. В противном случае выполнение вызывающего потока приостанавливается до тех пор, пока не будет получено уведомление о событии. Как только событие произойдет в другом потоке, этот поток установит событийный объект в сигнальное состояние, вызвав методSet. Поэтому методSet следует рассматривать как уведомляющий о том, что событие произошло. После установки событийного объекта в сигнальное состояние произойдет немедленный возврат из методаWaitOne, и первый поток возобновит свое выполнение. А в результате вызова методаReset событийный объект возвращается в несигнальное состояние.Событие типа
AutoResetEventотличается от события типаManualResetEventлишь способом установки в исходное состояние. Если для события типаManualResetEventсобытийный объект остается в сигнальном состоянии до тех пор, пока не будет вызван методReset, то для события типаAutoResetEventсобытийный объект автоматически переходит в несигнальное состояние, как только поток, ожидающий это событие, получит уведомление о нем и возобновит свое выполнение. Поэтому если применяется событие типаAutoResetEvent,то вызывать методReset необязательно.В приведенном ниже примере программы демонстрируется применение события типа
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("Основной поток получил " +
"уведомление о событии от второго потока.");
}
}