C#:使用Winforms关闭SerialPort的正确方法

gda*_*rio 7 c# serial-port winforms

我有一个应用程序,我从串口读取,一切顺利,直到我关闭应用程序.当我点击[X]时,应用程序只是挂起,UI:无响应.

我从DataReceived事件处理程序中的端口读取,并在FormClosed发生时关闭端口:

    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        mySerialPort.Close();
    }
Run Code Online (Sandbox Code Playgroud)

Zac*_*Saw 9

这不是一个错误.

它关闭它时它会挂起的唯一原因是因为在您的SerialPort对象的事件处理程序中,您正在与主线程同步调用(通常通过调用invoke).SerialPort的close方法等待其EventLoopRunner线程触发DataReceived/Error/PinChanged事件终止,但由于事件中你自己的代码也在等待主线程响应,你会遇到死锁情况.

错误报告"按设计"关闭的原因是因为"错误"在您自己的代码中.

  • 是的,使用BeginInvoke,而不是Invoke. (5认同)

SwD*_*n81 6

串口在关闭时挂起

这是SerialPort类的已知问题,在本产品反馈文章中描述,以及这些论坛中的几个主题.您可能会注意到"关闭设计"解雇.

  • 难以置信的!!!这是框架中的一个已知错误,由MS关闭为"按设计工作!!!" +1作为参考 (2认同)

小智 5

如果您的应用程序正在调用Invoke来处理接收的数据,请尝试调用BeginInvoke.

代替:

this.Invoke(d, new object[] { s, tb });
Run Code Online (Sandbox Code Playgroud)

使用:

this.BeginInvoke(d, new object[] { s, tb });
Run Code Online (Sandbox Code Playgroud)