Мне нужно решение для выполнения произвольной паузы. Точность задержки не имеет значения. Какова практическая разница в таком сценарии между WaitHandle.WaitOne Method (TimeSpan) и Thread.Sleep Method. Есть ли лучшие решения?AutoResetEvent.WaitOne с таймаутом против Thread.Sleep
ответ
Если спецификация говорит что-то вроде «Всегда ждать по крайней мере за две секунды до продолжения ", используйте Sleep().
Если ваша спецификация говорит что-то вроде «Подождите до двух секунд для сигнала из другого потока и верните ошибку, если время ожидания», используйте объект события.
В основном это просто.
По существу, нет различий в производительности. так как оба вызова используют один и тот же механизм для тайм-аутов.
«Лучшие решения» - что такое «лучше»? Лучше в каком отношении?
Лучше с точки зрения производительности или элегантности. –
1.Thread.Sleep (timeout) вызывает безусловное ожидание до возобновления выполнения.
2.WaitOne (тайм-аут) вызывает поток не ждать, пока либо
- событие срабатывает,
- Таймаут достигается
Тогда каково ваше предложение? Должен ли я использовать 1-й или 2-й? –
Это зависит от ваших требований. Я всегда предпочитаю синхронизацию на основе сигналов eg.WaitOne –
. Где находится часть, которая рассказывает о разнице в производительности между ожиданием в 1-м или 2-м манере? –
Я бы возражал против использования Thread.Sleep(...)
... просто потому, что мне не нравится блокировать поток без необходимости ... Поэтому, используя WaitHandle
, я думаю, что это лучший вариант.
Alternative
Если вы элегантность КОДИРУЙТЕ будет страдать от использования WaitHandle
, тогда вы считали await Task.Delay(...)
? Это даст функциональность, равную Thread.Sleep(...)
, без блокировки потока.
?? Ожидание дескриптора события блокирует поток, подобно вызовам sleep(). –
@MartinJames Но без блокировки потока ... 'Task.Delay()' фактически использует таймер. – Andrew
Асинхронное выполнение в другом потоке, например. по задаче.Delay(), безусловно, возможно, но OP задает вопрос о синхронных задержках в вызывающем потоке. –
«Лучше» зависит от обстоятельств. Ожидание в основном неправильное, поэтому здесь нет «лучшей практики». –
Что плохого в ожидании, когда все, что мне нужно, только ждет? Я просто задаюсь вопросом, какой метод лучше с точки зрения производительности или если они ведут себя одинаково под капотом, тогда я сделаю свое решение, основываясь на других факторах, таких как читаемость. –
Зачем вам создавать 'AutoResetEvent', вызывать' WaitOne', удалять событие, когда вы можете просто «Thread.Sleep»? – Henrik