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

时间:2009-11-08 13:28:24

标签: c# winforms serial-port

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

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

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

4 个答案:

答案 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)

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