2012-06-13 2 views
4

В приведенном ниже коде основная функция ожидает установки события ручной перезагрузки (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"); 
    } 
} 
+0

Что вы ожидаете? В приведенном выше примере mre.Set() уже выполняется до того, как вы закончите Thread.Sleep (1500), так что вы попадаете в состояние сигнализации. –

+0

с кодом, очевидно, что событие сброса будет установлено при ударе по кодовой строке WaitOne. Поскольку событие ручного сброса предназначено для использования так, как вы здесь, как это может быть «небезопасно»? – GameAlchemist

+0

У меня был тот же вопрос, что и ты много лет назад. Престижность к вам за то, что она возится с событиями перезагрузки. Они очень удобны для работы с потоками. – jglouie

ответ

5

Да. Если это уже сигнализировано, ждать не будет. Хорошо.

В самом деле, если вы посмотрите на возвращаемое значение WaitOne(int) вы увидите, что она возвращает true, если он уже установлен (или получает значение до тайм-аута), и false, если он не получает установлен в вашей тайм-аут стоимость.

Это различие иногда важно, поэтому имейте в виду, что существует возвращаемое значение.

0

Да, код просто продолжается.

Смежные вопросы