RegisterWaitForSingleObject vs System.Timers - PullRequest
       17

RegisterWaitForSingleObject vs System.Timers

1 голос
/ 08 ноября 2019

Мне нужно выполнить мой код после ожидания в течение определенного времени. Это должно происходить асинхронно, не блокируя мой поток. Я искал в Интернете и нашел много способов сделать это. Есть два варианта: использовать System.Timers или использовать RegisterWaitForSingleObject и ManualResetEvent.

Я не мог понять, какая разница или когда отдавать предпочтение одному из других. Не могли бы вы вкратце рассказать, почему и когда использовать Timers или RegisterWaitForSingleObject с ManualResetEvent?

Sidenote: Мне нравятся TAP и TPL, и я вообще предпочитаю их другим шаблонам (но это единственная причина, по которой не используется System.Timer?)

Ответы [ 2 ]

2 голосов
/ 08 ноября 2019

Таймеры

Вы используете Таймеры , когда хотите, чтобы один и тот же код выполнялся несколько раз, с определенным интервалом времени между ними.

RegisterWaitForSingleObject

В документации лучше всего сказано:

Регистрирует делегата, ожидающего WaitHandle .

И WaitHandle используется, когда вы хотите

ждать эксклюзивного доступа к общим ресурсам.

Если вы 'не ожидая общих ресурсов, тогда это не подходит для вашего варианта использования.

ManualResetEvent

Документация говорит

Представляет событие синхронизации потока, которое при получении сигнала должно быть сброшено вручную.

«Сигнализация» и «сброс» - это то, что должен делать ваш код. Он используется, когда один из ваших потоков должен сообщить другому из ваших потоков, что он может продолжить.

Ваш вариант использования

Вы сказали:

Мне нужно, чтобы мой код выполнялся после ожидания определенного времени.

Если вам не нужно повторять код снова и снова, и вы не ждете общих ресурсов, и выне ожидая другого потока, то ни один из перечисленных выше методов не подходит.

Если вам действительно нужно подождать определенное время, прежде чем двигаться дальше, то, как уже упоминалось, используйте Task.Delay:

await Task.Delay(5000); //wait 5 seconds
2 голосов
/ 08 ноября 2019

Вы используете WaitForSingleObject, чтобы дождаться, пока объект OBJECT не окажется в определенном состоянии. ИЛИ ПРОХОД времени. Так что это не то, что вы хотите сделать. Вы хотите, чтобы ваш код был "приостановлен" на определенное время. Таким образом, «время» здесь является основным результатом.

Я бы попытался перейти с await Task.Delay (мс). Это выглядит как наиболее удобный способ сделать это в настоящее время.

...