public static bool Wait(object
public static bool Wait(object
В первой форме ожидание длится вплоть до уведомления об освобождении объекта, а во второй форме — как до уведомления об освобождении объекта, так и до истечения периода времени, на который указывает количество
Ниже приведены общие формы методов Pulse () и PulseAll ():
public static void Pulse(object
где
Если методы Wait(),Pulse() nPulseAll() вызываются из кода, находящегося за пределами синхронизированного кода, например из блока lock, то генерируется исключение SynchronizationLockException.
Пример использования методов Wait () и Pulse ()
Для того чтобы стало понятнее назначение методов Wait () и Pulse (), рассмотрим пример программы, имитирующей тиканье часов и отображающей этот процесс на экране словами 'тик' и 'так'. Для этой цели в программе создается класс TickTock, содержащий два следующих метода: Tick () иТоск(). Метод Tick () выводит на экран слово 'тик', а метод Тоск () — слово 'так'. Для запуска часов далее в программе создаются два потока: один из них вызывает метод Tick (), а другой — метод Тоск (). Преследуемая в данном случае цель состоит в том, чтобы оба потока выполнялись, поочередно выводя на экран слова 'тик' и 'так', из которых образуется повторяющийся ряд 'тик-так', имитирующий ход часов/
using System;
using System.Threading;
class TickTock {
object lockOn = new object (); public void Tick(bool running) { lock(lockOn) {
if(!running) { // остановить часы ‘Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки return;
}
Console.Write('тик ');
Monitor.Pulse(lockOn); // разрешить выполнение метода Tock() Monitor.Wait(lockOn); // ожидать завершения метода Tock()
}
}
public void Tock(bool running) { lock(lockOn) {
if(!running) { // остановить часы
Monitor.Pulse(lockOn); // уведомить любые ожидающие потоки return;
}
Console.WriteLine('так');
Monitor.Pulse(lockOn); // разрешить выполнение метода Tick() Monitor.Wait(lockOn); // ожидать завершения метода Tick()
}
}
}
class MyThread {
public Thread Thrd;
TickTock ttOb;
// Сконструировать новый поток.
public MyThread(string name, TickTock tt) {
Thrd = new Thread(this.Run); ttOb = tt;
Thrd.Name = name;
Thrd.Start(); '
}
// Начать выполнение нового потока, void Run() {
