В приведенном ниже коде основная функция ожидает установки события ручной перезагрузки (mre). Однако перед начинается ожидание, объект синхронизации уже установлен в состояние сигнализации другим потоком..NET Сброс события. Событие
Итак, безопасно ли ждать «уже сигнализированных объектов синхронизации»?
class Program
{
static void Main(string[] args)
{
ManualResetEvent mre = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(Func), mre);
Thread.Sleep(1500);
mre.WaitOne(100000); // Waiting for already signaled object
Console.WriteLine("Wait Completed");
}
public static void Func(object state)
{
ManualResetEvent mre = (ManualResetEvent)state;
mre.Set();
Console.WriteLine("Mre Is Set");
}
}
Что вы ожидаете? В приведенном выше примере mre.Set() уже выполняется до того, как вы закончите Thread.Sleep (1500), так что вы попадаете в состояние сигнализации. –
с кодом, очевидно, что событие сброса будет установлено при ударе по кодовой строке WaitOne. Поскольку событие ручного сброса предназначено для использования так, как вы здесь, как это может быть «небезопасно»? – GameAlchemist
У меня был тот же вопрос, что и ты много лет назад. Престижность к вам за то, что она возится с событиями перезагрузки. Они очень удобны для работы с потоками. – jglouie