【问题标题】:C#: Proper way to close SerialPort with WinformsC#:使用 Winforms 关闭 SerialPort 的正确方法
【发布时间】:2009-11-08 13:28:24
【问题描述】:

我有一个应用程序,我从串口读取数据,一切正常,直到我关闭应用程序。当我点击 [X] 时,应用只是挂起,用户界面:无响应。

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

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

【问题讨论】:

    标签: c# winforms serial-port


    【解决方案1】:

    Serial Port hangs while closing

    这是 SerialPort 类的一个已知问题,在这篇 Product Feedback 文章以及这些论坛中的几个主题中进行了描述。您可能会注意到“按设计关闭”的解雇。

    【讨论】:

    • +1,这与 OP 的上一个问题有关。但是对于一个好的 SO 答案,您可以在此处发布简短摘要。假设该页面移动了?
    • 难以置信!!!这是框架中的一个已知错误,被 MS 关闭为“按设计工作!!!” +1 供参考
    • 哈哈。请看下面我的回答。 .NET 框架中存在严重的串行端口代码错误,但这不是
    【解决方案2】:

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

    代替:

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

    使用:

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

    【讨论】:

      【解决方案3】:

      这不是错误。

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

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

      【讨论】:

      • 是的,使用 BeginInvoke,而不是 Invoke。
      • 谢谢大家,这是真的...... BeginInvoke 解决了我的问题。
      【解决方案4】:

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

      【讨论】:

      • 它也会挂在 dispose 上......当 dispose 关闭它时,你必须使用 BeginInvoke。当然,关闭应用程序并不重要。但是,如果您在不关闭应用程序的情况下打开和关闭多个串行端口,这很重要。
      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多