Как закрыть поток (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()"); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д