Новый 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
)?
Ответы
Ответ 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, кратко: (