У нас есть следующий код C # для связи через последовательный порт:
ProcCntrlSSPort = new SerialPort(portNumber, 115200, Parity.None, 8, StopBits.One);
ProcCntrlSSPort.Handshake = Handshake.None;
ProcCntrlSSPort.ReadTimeout = 10;
ProcCntrlSSPort.ReadBufferSize = 32768;
ProcCntrlSSPort.DataReceived += ProcCntrlSSPortDataReceived;
//ProcCntrlSSPort.DataReceived += new SerialDataReceivedEventHandler(ProcCntrlSSPortDataReceived);
ProcCntrlSSPort.ReceivedBytesThreshold = 1;
try
{
ProcCntrlSSPort.Open();
ProcCntrlSSPort.DiscardInBuffer();
}
Каждые 100 мсек наше приложение получает сообщение о состоянии. Я понимаю, что когда SerialPort
получил ReceivedBytesThreshold
число байтов, событие SerialPort
вызовет событие. Мы должны использовать 1 для ReceivedBytesThreshold
, потому что одна из наших важных данных отправляется 1 байтом каждый раз, когда этот байт доступен.
Когда событие вызывается SerialPort и обрабатывается получателем, это событие должно быть удалено, и поток, связанный с этим событием, должен быть доступен для следующего использования. поэтому не должно быть большого количества накопленных потоков.
Но я обнаружил, что количество запущенных потоков будет непрерывно увеличиваться с 20 до более 400 потоков за одну ночь. Просто сообщение о статусе отправляется в наше приложение, никаких других действий тогда. Я отключил весь код процесса, поэтому я уверен, что накопленные потоки НЕ из нашего кода. Это означает, что мы ничего не делаем с полученными данными для целей тестирования.
Я увеличил ReceivedBytesThreshold
, говоря 128, для целей тестирования. Это замедлит накопление, но количество потоков все равно будет медленно расти. почему .net Framework не может правильно обрабатывать их потоки? Или я не правильно его использовал?