C# 操作串口提示错误:由于IO线程退出或应用程序请求,已中止IO操作。

贴出代码
1.线程循环发送
public void PortListenThread()
{
while (true)
{
byte[] query = new byte[8] { 0x01, 0x02, 0x00, 0x00, 0x00, 0x10, 0x79, 0xC6 };
serPort.DiscardInBuffer();
serPort.Write(query, 0, query.Length);
Delay(500);
}
}

2.一个字节自动触发接收
public void IO_EventHandler(object sender, SerialDataReceivedEventArgs e)
{
int count = 0;

        Delay(100);

        count = serPort.BytesToRead;

        if (count < 6)
        {
            serPort.DiscardInBuffer();
        }
        else if (count > 6)
        {
            byte[] readBuffer = new byte[count];

            try
            {
                serPort.Read(readBuffer, 0, count);//报错:由于IO线程退出或应用程序请求,已中止IO操作。
            }
            catch (Exception a)
            {
                MessageBox.Show(a.Message);
            }

PortListenThread放在工作线程里执行?那么操作串口的代码不能直接写,而是应该用
Control.Invoke委托让UI执行。

这是线程的安全限制所致。两种方法,一种关闭限制(不提倡);另一就是用UI控件的Invoke方法回调执行

启动PortListenThread时,改用新线程。
如:
new Thread(PortListenThread).Start();

跨执行域,可以用委托解决

private void "123"