ManualResetEventSlim блокирует потоки, т. Е. Тратит их? - PullRequest
0 голосов
/ 24 сентября 2019

Я генерирую RTP-пакет каждые 20 мс для каждого вызова.Каждый вызов обрабатывается после «ожидания» моего прослушивающего сервера UDPClient.ReceiveAsync.

Я использую высокоточный таймер (использующий TimeSetEvent из winmm.dll), который запускает каждые 20 мс и «устанавливает» выделенный ManualResetEventSlim (MRES)объект, созданный для каждого входящего UDP-вызова.Каждый раз, когда устанавливается MRES, поток вызовов освобождается, и при каждом вызове отправляется один пакет и т. Д.

Потеряю ли я потоки, продолжая блокировать поток без операции, связанной с ЦП, пока его MRESне сигнализируется?Существует ли «асинхронная» версия этой MRES, которую можно ждать.Если да, увеличит ли это дроссель моего основного цикла UDPClient.RececiveAsync?

Приложение - Windows WinForms и другая версия как Служба Windows .

1 Ответ

2 голосов
/ 24 сентября 2019

Потеряю ли я потоки, продолжая блокировать поток без какой-либо операции с привязкой к ЦП, пока его MRES не сигнализируется?

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

Существует ли асинхронная версия этой MRES, которая может ожидать.

Да, есть AsyncManualResetEvent как часть моей AsyncEx библиотеки .Или вы можете создать свой собственный .Версия Стивена Тауба, созданная вами, более производительна;моя версия AsyncEx оптимизирована с точки зрения удобства обслуживания, а не производительности.

Если да, увеличит ли это дроссель моего основного цикла UDPClient.RececiveAsync?

Не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...