由于线程退出或串行端口中的应用程序请求,I / O操作已中止

时间:2014-05-15 10:38:33

标签: c# windows winforms

我正在使用一个窗口应用程序来连续显示文本框上串行端口的数据。以下是我的代码。我运行程序时遇到此错误:

  

"由于线程退出或应用程序请求,I / O操作已中止。"

我该如何解决这个问题?

    private void mainform_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Maximized;   
        getWGT();           
    }
    SerialPort port = new SerialPort();
    public void getWGT()
    {            
        try
        {

            port.PortName = "COM1";
            port.BaudRate = 9600;
            port.StopBits = System.IO.Ports.StopBits.One;
            port.DataBits = 8;
            port.Parity = System.IO.Ports.Parity.None;

            port.Open();

            port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
   public delegate void myDelegate();
    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {          
        tWGT.BeginInvoke(new myDelegate(updateTextBox));
    }

    public void updateTextBox()
    {
        try
        {
            tWGT.AppendText(port.ReadExisting());
            tWGT.ScrollToCaret();
        }
        catch {
            port.Close();
        }
    }

1 个答案:

答案 0 :(得分:0)

SerialPort正在线程上使用它自己的Eventloop。当您订阅DataReceived事件时,最好不要在UI线程上读取端口数据。一旦掌握了所有数据,最好将其保留在后台线程和切换上下文中。

我要做的另一个补充是在表单关闭时调用port.Close。在可以处理SerialPort之后。

以下方法已更改为包含我上述的更改:

populateModels()