У нас есть код последующих 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 не может правильно обрабатывать свои потоки? Или я не использовал его правильно?
Ummmm. Не звучать умно-алексей, но не для .NET Framework правильно обрабатывать протектор, это зависит от разработчика. У нас есть приложение для сканирования, которое обрабатывает тысячи купонов в день по последовательному порту и не имеет проблем. Вы правильно исследовали связь с последовательным портом с .NET, чтобы понять, что вы делаете и что происходит? Threading сложный, и вы не можете рассчитывать на это, не понимая его больше, чем вы ожидали бы, чтобы безопасно управлять автомобилем в большом городе, не изучая правила дорожного движения. – David
Вы хотите создать потоки в функции 'ProcCntrlSSPortDataReceived'? Не могли бы вы разместить то, что вы там делаете? Вероятно, проблема заключается в том, где вы создаете потоки. – SwDevMan81
мы не использовали собственный поток для обработки последовательного порта. Я думаю, что класс SerialPort .Net создает поток для обработки последовательного порта. – 5YrsLaterDBA