Обычная мудрость гласит, что "опрос плохой", потому что он часто заканчивается процессом, связанным с процессором. Если вместо этого используется блокирующий ввод / вывод, то процессор доступен для других процессов, пока не произойдет событие.
Тем не менее, обычно можно настроить все так, чтобы опрос ожидал (короткого) тайм-аута перед возвратом, когда нет доступных символов. Если выбрано подходящее время ожидания, то ваш простой цикл опроса использует значительно меньше процессорного времени, и другие процессы также запускаются.
Я вообще не использовал последовательные порты из C #, но я рискну предположить, что под документацией подразумевается
Событие DataReceived не гарантируется для каждого полученного байта. использование
свойство BytesToRead, чтобы определить, сколько данных осталось для чтения в буфере.
- это то, что вы не можете ожидать получить одно событие за персонажа. При некоторых обстоятельствах он может доставить событие с более чем одним доступным символом. Просто восстановите все доступные символы в вашем обработчике событий, и все будет хорошо.
Редактировать: Выполнение блокировки вызова в потоке читателя может быть лучшим ответом в целом. Это не опрос сам по себе, так как поток блокируется, пока не поступят символы. Возможно, вам придется настроить размеры буфера и некоторые настройки последовательного порта, если вам нужно обрабатывать данные по мере их поступления, а не в виде фрагментов фиксированного размера.