Как закрыть поток (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()"); }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.643 из 5