Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения - C#

Узнай цену своей работы

Формулировка задачи:

Такая проблема. Прибор посылает каждые 4 сек данные. Считываю с порта по событию DataReceived. Закрываю порт по кнопке

ПрочитатьToolStripButton

. Так вот, если нажать эту кнопку не в нужный момент, выскакивает сообщение:

Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.

Как избавиться от этой проблемы? Кусок кода:
ComPort.DataReceived += new SerialDataReceivedEventHandler(Port_Read);
 
void Port_Read(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {          
                for (int i = 0; i < 344; i++)
                {
                    rez[i] = Convert.ToByte(ComPort.ReadByte()); 
                }
 
                SetText(Encoding.ASCII.GetString(rez)); //вызов делегата
            }
           catch (Exception e3)
            {
                MessageBox.Show(e3.Message);
            }
         }
 
       //Открытие - Закрытие порта
        private void ПрочитатьToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {              
                if (ComPort.IsOpen)
                {                              
                    toolStripComboBox1.Enabled = false;
                    ComPort.Close();
                }
                else
                {
                    ComPort.Open();                  
                }
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.Message);
            }
        }
Такая же ошибка может выскакивать, если вытаскиваешь кабель RS с прибора
не в нужный момент

Решение задачи: «Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения»

textual
Листинг программы
if (ComPort.IsOpen)
                {                              
                    toolStripComboBox1.Enabled = false;
                    ComPort.DataReceived -= Port_Read;
                    ComPort.Close();
                }
                else
                {
                    ComPort.DataReceived += Port_Read;
                    ComPort.Open();                  
                }

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


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

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

8   голосов , оценка 4.125 из 5
Похожие ответы