串口-我不能在port_received方法中调用form和ShowDialog

本文关键字:方法 调用 form ShowDialog received 不能 port 串口 | 更新日期: 2023-09-27 18:08:39

我正在监听端口,一旦我收到消息,做一些处理,而不是插入到数据库中。到目前为止一切顺利。问题是,在port_received的方法中,我想弹出显示设备接收到消息的形式,并取决于用户单击OK并查看消息。在弹出式表单的背景有一个定时器和关闭的形式在2秒,除非用户不点击按钮看到的消息。我调用的形式比.ShowDialog()之后,我失去了我的串口通信。如果我用.Show(),我不能正确地看到部分代码:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    data = comport.ReadLine();
    ReceiveMessagePopup popUp = new ReceiveMessagePopup(data);
    popUp.Location = new Point(150, 150);
    popUp.ShowDialog();
    /// after that code I cannot do anything even cannot show any MessageBox. 
}

串口-我不能在port_received方法中调用form和ShowDialog

我不会在该方法中放置ShowDialog或任何其他UI管理,因为它可以在收到数据后多次引发。

我认为事件处理程序应该只是接收和存储数据的地方和ShowDialog或其他通知或UI处理应该完成的方法。

关于如何使用该事件处理程序并保存传入数据的示例,请参阅此处:

如何在c#中使用SerialPort端口对象的dataReceived事件?

来自MSDN关于SerialPort的文章。DataReceived

"当从SerialPort对象接收数据时,在次要线程上引发DataReceived事件。由于此事件是在辅助线程而不是主线程上引发的,因此尝试修改主线程中的某些元素(如UI元素)可能会引发线程异常。如果需要修改主Form或Control中的元素,请使用Invoke返回更改请求,它将在适当的线程上完成工作。"

使用控制。BeginInvoke在主UI线程上执行代码以显示对话框。例如

假设此代码位于继承Form

的类中
var data = comport.ReadLine();
_buffer.Append(data);
if (_buffer.IsValid)
{
    BeginInvoke((Action) (() =>
                                {
                                    ReceiveMessagePopup popUp = new ReceiveMessagePopup(buffer);
                                    popUp.Location = new Point(150, 150);
                                    popUp.ShowDialog();
                                }));
}

你不想做长时间运行的任务时,大卫。指出,对话框显示每次提出的事件是可能不是一个好主意,因为你可能会得到许多事件,即使是一行的数据串行端口,所以这就是为什么我添加端口读取的数据缓冲区,如果缓冲区是有效的(例如,包含一个全/信息/包/无论行)然后显示对话框