Рассмотрим следующую ситуацию. Поток
Гвыполняется в кодовом блокеlock,и ему требуется доступ к ресурсусреды. Более совершенное решение заключается в том, чтобы временно освободить объект и тем самым дать возможность выполняться другим потокам. Такой подход основывается на некоторой форме сообщения между потоками, благодаря которому один поток может уведомлять другой о том, что он заблокирован и что другой поток может возобновить свое выполнение. Сообщение между потоками организуется в C# с помощью методов
Wait , Pulse () иPulseAll .Методы
Wait, Pulse и PulseAll определены в классеMonitorи могут вызываться только из заблокированного фрагмента блока. Они применяются следующим образом. Когда выполнение потока временно заблокировано, он вызывает методWait. В итоге поток переходит в состояние ожидания, а блокировка с соответствующего объекта снимается, что дает возможность использовать этот объект в другом потоке. В дальнейшем ожидающий поток активизируется, когда другой поток войдет в аналогичное состояние блокировки, и вызывает метод Pulse или PulseAll . При вызове метода Pulse возобновляется выполнение первого потока, ожидающего своей очереди на получение блокировки. А вызов метода PulseAll сигнализирует о снятии блокировки всем ожидающим потокам.Ниже приведены две наиболее часто используемые формы метода
Wait .public static bool Wait(object
public static bool Wait(object
В первой форме ожидание длится вплоть до уведомления об освобождении объекта, а во второй форме — как до уведомления об освобождении объекта, так и до истечения периода времени, на который указывает количество
Ниже приведены общие формы методов
Pulse иPulseAll:public static void Pulse(object
где
Если методы
Wait,Pulse nPulseAllвызываются из кода, находящегося за пределами синхронизированного кода, например из блокаlock,то генерируется исключениеSynchronizationLockException.Пример использования методов Wait и Pulse