Он отправляет 1 байт данных каждые 30 миллисекунд, и я должен отреагировать на него как можно скорее.
Это крайне трудно сделать в Windows, которая не является операционной системой реального времени. На самом деле, все, что вы можете сделать, - это сделать все возможное, понимая, что неожиданное антивирусное сканирование может сойти с него.
Однажды меня отправили на сайт клиента, чтобы выяснить тайм-ауты связи TCP / IP, которые произошли только ночью. Полет на самолете, проживание в отеле, весь Шебанг. Оказывается, ночная смена играла в DOOM. Правдивая история.
Таким образом, вы не можете гарантировать такое приложение всегда будет работать; вам просто нужно приложить все усилия.
Во-первых, я рекомендую продолжать непрерывное чтение. Всегда читайте. Буквально, как только чтение завершится, поместите этот байт в очередь производителя / потребителя и снова начните чтение как можно скорее. Не беспокойтесь о таймауте; просто продолжайте читать.
Второе, что вы можете сделать, это уменьшить накладные расходы. В этом случае вы вызываете Socket API, который возвращает Task<T>
; было бы лучше назвать тот, который возвращает ValueTask<T>
:
var len = await _socket.ReceiveAsync(
new ArraySegment<byte>(Buffer, Offset, Count).AsMemory(), SocketFlags.None)
.ConfigureAwait(false);
См. в этом блоге , чтобы узнать, как ValueTask<T>
уменьшает использование памяти, особенно с сокетами.
В качестве альтернативы, вы можете сделать цикл чтения запущенным синхронно в отдельном потоке, как указано в комментариях. Приятным аспектом для отдельного потока является то, что вы можете повысить его приоритет даже в диапазоне «в реальном времени». Но есть драконы - вы действительно не хотите этого делать, если у вас нет буквального выбора. Если в этом потоке есть какая-либо ошибка, вы можете заблокировать всю ОС.
Как только вы сделаете свой цикл чтения как можно более узким (никогда не ожидая какой-либо обработки) и сократите выделение памяти (предотвращая ненужные сборщики мусора), это все, что вы можете сделать. Когда-нибудь кто-нибудь запустит DOOM, и вашему приложению придется постараться изо всех сил.