2014-01-22 2 views
8

Мне нужно решение для выполнения произвольной паузы. Точность задержки не имеет значения. Какова практическая разница в таком сценарии между WaitHandle.WaitOne Method (TimeSpan) и Thread.Sleep Method. Есть ли лучшие решения?AutoResetEvent.WaitOne с таймаутом против Thread.Sleep

+0

«Лучше» зависит от обстоятельств. Ожидание в основном неправильное, поэтому здесь нет «лучшей практики». –

+1

Что плохого в ожидании, когда все, что мне нужно, только ждет? Я просто задаюсь вопросом, какой метод лучше с точки зрения производительности или если они ведут себя одинаково под капотом, тогда я сделаю свое решение, основываясь на других факторах, таких как читаемость. –

+0

Зачем вам создавать 'AutoResetEvent', вызывать' WaitOne', удалять событие, когда вы можете просто «Thread.Sleep»? – Henrik

ответ

6

Если спецификация говорит что-то вроде «Всегда ждать по крайней мере за две секунды до продолжения ", используйте Sleep().

Если ваша спецификация говорит что-то вроде «Подождите до двух секунд для сигнала из другого потока и верните ошибку, если время ожидания», используйте объект события.

В основном это просто.

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

«Лучшие решения» - что такое «лучше»? Лучше в каком отношении?

+0

Лучше с точки зрения производительности или элегантности. –

5

1.Thread.Sleep (timeout) вызывает безусловное ожидание до возобновления выполнения.

2.WaitOne (тайм-аут) вызывает поток не ждать, пока либо

  • событие срабатывает,
  • Таймаут достигается
+0

Тогда каково ваше предложение? Должен ли я использовать 1-й или 2-й? –

+0

Это зависит от ваших требований. Я всегда предпочитаю синхронизацию на основе сигналов eg.WaitOne –

+0

. Где находится часть, которая рассказывает о разнице в производительности между ожиданием в 1-м или 2-м манере? –

1

Я бы возражал против использования Thread.Sleep(...) ... просто потому, что мне не нравится блокировать поток без необходимости ... Поэтому, используя WaitHandle, я думаю, что это лучший вариант.

Alternative

Если вы элегантность КОДИРУЙТЕ будет страдать от использования WaitHandle, тогда вы считали await Task.Delay(...)? Это даст функциональность, равную Thread.Sleep(...), без блокировки потока.

+0

?? Ожидание дескриптора события блокирует поток, подобно вызовам sleep(). –

+0

@MartinJames Но без блокировки потока ... 'Task.Delay()' фактически использует таймер. – Andrew

+0

Асинхронное выполнение в другом потоке, например. по задаче.Delay(), безусловно, возможно, но OP задает вопрос о синхронных задержках в вызывающем потоке. –