Это очень необычно, но технически возможно. SerialPort использует потоки пула потоков для вызова обработчика событий DataReceived. Как только он получает один или несколько байтов, он захватывает поток TP, чтобы уведомить ваше приложение. В коде генерации события есть блокировка, только один поток может вызывать ваш обработчик событий одновременно.
Здесь возможный режим сбоя заключается в том, что один из этих вызовов, вероятно первый, входит в цикл в вашем коде, из которого он никогда не выходит. Если вы не настроили свойство «Рукопожатие», устройство может продолжать отправлять и инициировать дополнительные вызовы TP, причем все они блокируются при этой блокировке.
Диагностируйте это из окна Debug + Windows + Threads. Если мое предположение верно, то вы должны увидеть большое количество тем, перечисленных здесь. Один из них должен быть внутри вашего обработчика событий DataReceived, дважды щелкните его и посмотрите на стек вызовов, чтобы увидеть, где он застрял. Память, которую вы видите потребляемой, съедается стеками этих потоков, по одному мегабайту каждый.
Другая возможность состоит в том, что ваш код обработки событий DataReceived будет очень медленным, возможно, вызвав Control.Invoke (). Достаточно медленно, чтобы не успевать за устройством. Теперь вам действительно нужно использовать свойство Handshake для настройки управления потоком. Или исправить то, что делает это так медленно. Между прочим, должно быть очень большое количество событий ErrorReceived, убедитесь, что реализовали это, чтобы вы могли видеть, что все идет не так.
Существует верхний предел количества потоков TP, которые могут быть запущены одновременно. Это довольно щедрый, в 250 раз больше ядер. Это может легко потреблять половину гигабайта памяти на обычной двухъядерной машине.