Wait
Wait и Pulse вызывают только внутри lock на том же объекте.
Синтаксис
Monitor.Wait(gate);
Пример
Давайте дождёмся сигнала через флаг ready:
using System;
using System.Threading;
class Program
{
static void Main()
{
var gate = new object();
bool ready = false;
var worker = new Thread(() =>
{
lock (gate)
{
ready = true;
Monitor.Pulse(gate);
}
});
worker.Start();
lock (gate)
{
while (!ready)
Monitor.Wait(gate);
}
worker.Join();
Console.WriteLine(ready);
}
}
Результат выполнения кода:
True
Пример
Давайте вызовем Monitor.Wait вне lock:
using System;
using System.Threading;
class Program
{
static void Main()
{
var gate = new object();
try
{
Monitor.Wait(gate);
Console.WriteLine("ok");
}
catch (SynchronizationLockException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Смотрите также
-
Pulse,
разбудить одного -
PulseAll,
разбудить всех -
Enter,
захват перед Wait -
ManualResetEventSlim,
событие-сигнал