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

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

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

private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); } 

这不是一个错误。

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

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

关闭时串行端口挂起

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

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

代替:

 this.Invoke(d, new object[] { s, tb }); 

使用:

 this.BeginInvoke(d, new object[] { s, tb }); 

如果您只想在应用程序关闭时关闭端口,最简单的解决方案就是不要打扰关闭()端口。 当应用处理串口时,端口仍会关闭。 应用程序重新启动时可以再次打开该端口,或者可能希望使用该端口的其他应用程序再次打开该端口。