Как закрыть поток (Thread) чтения SerialPort - C#
Формулировка задачи:
Как грамотно организовать (а главное завершать) поток чтения SerialPort?
Проблемы с этим кодом:
- ошибка при закрытие порта: "операция ввода/вывода была прервана из-за завершения потока команд или
по запросу приложения"
- программа (или поток/процес) не завершается после собсно закрытия программы
- загружает ЦП на 100%, начинает тормозить система
- Thread.Abort(): если побаловаться с ним (рядом с закрытием порта ставил), то вот такое выдает: "дескриптор SafeHandle был закрыт"
readThread = new Thread(read); readThread.Start(); port.Open(); port.Close(); - исключение "Операция ввода/вывода была прервана бла-бла..." (readThread.ThreadState = Running) port.Open() - ThreadState = WaitSleepJoin port.Close() - исключение и ThreadState = running
SerialPort port; Thread readThread; public Form1() { InitializeComponent(); port = new SerialPort("COM1"); } private void read() { while (true) { if (port.IsOpen) { try { string mess = port.ReadLine(); Invoke(new EventHandler(delegate { textBox2.AppendText("modem: " + mess + Environment.NewLine); })); } catch (Exception ex) { MessageBox.Show(ex.Message + "\n: read()"); } } } } private void OpenPort() { port.Open(); readThread = new Thread(read); readThread.Start(); } private void ClosePort() { port.Close(); }
Решение задачи: «Как закрыть поток (Thread) чтения SerialPort»
textual
Листинг программы
catch (IOException) { } * * //это исключение появится при закрытии без аборта catch (TimeoutException) { } catch (Exception ex) { MessageBox.Show(ex.Message + "\n: read()"); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д