Подтвердить что ты не робот

Новый AutoResetEvent (true) Использование в С#?

Мне было интересно,

Почему мне когда-либо хотелось передать true в ctor AutoResetEvent?

Я создаю waitHandle, чтобы любой, кто будет называть WaitOne(), на самом деле ожидал.

Если я укажу его с помощью true, он будет как если бы он был немедленно сигнализирован - это как обычный поток без ожидания.

  EventWaitHandle _waitHandle = new AutoResetEvent (false);

void Main()
{
  new Thread (Waiter).Start();
    Thread.Sleep (1000);                   
    _waitHandle.Set();                    

Console.ReadLine();
}
  void Waiter()
  {
    Console.WriteLine ("AAA");
    _waitHandle.WaitOne();                 
    Console.WriteLine ("BBBB");
  }

вывод:

AAA...(delay)...BBB

изменяется на: EventWaitHandle _waitHandle = new AutoResetEvent (true);, а выход будет:

AAABBB

Вопрос:

  • Зачем мне это делать? (прохождение true)?
4b9b3361

Ответ 1

Сценарий будет состоять в том, что первый поток, который вызывает WaitOne, должен немедленно пройти, не блокируя.

Проверьте документацию Silverlight для AutoResetEvent (как ни странно, документ не совпадает с версиями .Net):

Задание true для initialState создает AutoResetEvent в сигнальное состояние. Это полезно, если вы хотите, чтобы первый поток ожидает, что AutoResetEvent будет выпущен немедленно, без блокировка ".

Ответ 2

Здесь есть хорошее объяснение: Сигнализация с обработчиками ожидания событий.

Чтобы перефразировать, ручка ожидания похожа на турникет, а вызывающие абоненты WaitOne похожи на линию людей, стоящих в очереди на турникете. Каждый раз, когда вызывается Set, турникет разрешает одному человеку (обычно в том порядке, в котором они поставлены в очередь, но иногда нет, из-за особенностей ОС).

Если он построен с "истинным", то турникет уже открыт, но только для одного человека, так что первый вызывающий элемент WaitOne будет "пропущен" сразу, но любые последующие абоненты будут по-прежнему иметь для очереди.

Очевидно, что все это не применимо, если у вас есть только один вызывающий объект WaitOne, и поэтому параметр "true" будет спорным.

Ответ 3

Конечно.

Одно требование - поток X должен запускаться в начале приложения и каждые 10 секунд после этого. Приоритет WaitForSingleObject (myARE, 10000) выполнит эту работу. Инициализация ARE до "true" гарантирует, что поток запускается при запуске.

Edit:

myARE.WaitOne(10000);

Извините - я выбыл из режима С# в WINAPI, кратко: (