我有一个应用程序,我从串口读取,一切顺利,直到我关闭应用程序。当我点击[X]时,应用程序只是挂起,UI:无响应。
我从DataReceived事件处理程序中的端口读取,并在FormClosed发生时关闭端口:
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
mySerialPort.Close();
}
答案 0 :(得分:9)
这不是一个错误。
关闭它时它会挂起的唯一原因是因为在您的SerialPort对象的事件处理程序中,您正在与主线程同步调用(通常通过调用invoke)。 SerialPort的close方法等待其EventLoopRunner线程触发DataReceived / Error / PinChanged事件终止,但由于事件中你自己的代码也在等待主线程响应,你会遇到死锁情况。
错误报告“按设计”关闭的原因是因为“错误”在您自己的代码中。
答案 1 :(得分:6)
Serial Port hangs while closing
这是SerialPort类的一个已知问题,在本Product Feedback文章以及这些论坛中的几个主题中有所描述。您可能会注意到“关闭设计”解雇。
答案 2 :(得分:5)
如果您的应用程序正在调用Invoke处理接收的数据,请尝试调用BeginInvoke。
而不是:
this.Invoke(d, new object[] { s, tb });
使用:
this.BeginInvoke(d, new object[] { s, tb });
答案 3 :(得分:1)
最简单的解决方案,如果你只想在应用程序关闭时关闭端口,就是不要打扰关闭()端口。当应用处理串口时,端口仍会关闭。您的应用重启时,或者可能希望使用该端口的其他应用程序可以再次打开该端口。