Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:使用Winforms关闭SerialPort的正确方法_C#_Winforms_Serial Port - Fatal编程技术网

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

C#:使用Winforms关闭SerialPort的正确方法,c#,winforms,serial-port,C#,Winforms,Serial Port,我有一个应用程序,我从串口读取数据,一切正常,直到我关闭应用程序。当我点击[X]时,应用程序只是挂起,用户界面:无响应 我从DataReceived事件处理程序中的端口读取数据,并在FormClosed发生时关闭端口: private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); } 这是SerialPort类的一个已知问题,

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

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

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

这是SerialPort类的一个已知问题,本文以及这些论坛中的几个线程对此进行了描述。您可能会注意到“设计关闭”解雇

这不是一个bug

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


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

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

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

而不是:

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


+1,这与OP的前一个问题有关。若不是一个好的答案,你们可以在这里发布简短的总结。假设页面移动了?难以置信!!!这是框架中的一个已知错误,MS将其关闭为“按设计工作!!!”+1表示参考。见下面我的答案。在.NET framework中有一个严重的串行端口代码错误,但事实并非如此。是的,使用BeginInvoke,而不是Invoke。谢谢大家,这是真的。。。BeginInvoke解决了我的问题。它也将挂起。。。当dispose关闭时,您必须使用BeginInvoke。当然,关闭应用程序也没关系。。但是,如果您在不关闭应用程序的情况下打开和关闭多个串行端口,这一点很重要。
this.BeginInvoke(d, new object[] { s, tb });