none
Необработанное исключение типа "System.ObjectDisposedException" в mscorlib.dll(Работа с СОМ портом) RRS feed

  • Вопрос

  • Добрый день!Подскажите пожалуйста.Возникает ошибка

    Необработанное исключение типа "System.ObjectDisposedException" в mscorlib.dll

    Дополнительные сведения: Дескриптор SafeHandle был закрыт.

    Суть в чем,я в потоке принимаю данные с СОМ порта,и хочу каждые допустим 5000 миллисекунт выводите сообщение на форму о том,что если данные не приняты в этот период то ошибка,если приняты выводить соответственно эти данные.Ошибка возникает в момент когда я закрываю форму(по нажатию закрыть убивается поток).Я догадываюсь что ошибка в конфликте записи данных на форму,но не могу понять в чем дело.

    private void Form2_Load(object sender, EventArgs e)
            {
                Form1 frm = (Form1)this.Owner;
     
                readerThread = new Thread(Read);
                readerThread.Start();
            //   frm.serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            
              //  readThread = new Thread(Writer);
              //  readThread.Start();
            }
     public void Read()
            {
                Form1 frm = (Form1)this.Owner;
                this.BeginInvoke((MethodInvoker)delegate
                {
     
                    //textBox1.Text=writestring;
     
                    sl = Convert.ToInt32(frm.textBox3.Text);  //время задержки с первой формы
     
                });
                
                string readstring;
                while (true)
                {
                    try
                    {
                        frm.serialPort1.ReadTimeout = sl;
                        //  Thread.Sleep(sl);
                        byte[] data = new byte[256];
                      
                        frm.serialPort1.Read(data, 0, data.Length);
                        readstring = Encoding.ASCII.GetString(data);
     
                        //readstring = serialPort1.ReadLine();
                        this.Invoke((MethodInvoker)delegate
                        {
                           listBox1.Items.Add(readstring + "\r\n");  //принятые данные с порта
                            //AppendText(readstring + "\r\n");
                        });
     
                    }
                    catch (TimeoutException)
                    {
                       //// MessageBox.Show("error");
                      this.Invoke((MethodInvoker)delegate
                      {
                          listBox1.Items.Add("Превышен интервал ожидания в" +sl);
                      //    //  AppendText(readstring + "\r\n");
                       });
     
                 }
                  
                }
      private void Form2_FormClosed(object sender, FormClosedEventArgs e)
          {
            //  readThread.Abort();
             readerThread.Abort();


    • Изменено vyt386 5 августа 2014 г. 7:14
    5 августа 2014 г. 7:10

Ответы

  • Здравствуйте. Во-первых, Событие FormClosed посылается когда форма уже закрыта, а Ваш поток продолжает работать и пытается что-то на ней отображать. Лучше использовать событие FormClosing, посылаемое ПЕРЕД закрытием формы.

    Во-вторых, метод Abort генерирует в потоке исключение ThreadAbortException. Его также необходимо перехватить и корректно завершить метод Read, если не хотите новых необработанных ошибок.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа vyt386 6 августа 2014 г. 14:59
    5 августа 2014 г. 10:16