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