接收到串行端口数据时如何处理多个操作
本文关键字:处理 操作 何处理 串行端口 数据 | 更新日期: 2023-09-27 18:21:59
我定义了一个串行端口(C#/.Net),然后为接收到的数据分配了一个串行数据接收事件处理程序。
myPort.DataReceived += new SerialDataReceivedEventHandler (myEventHandler);
然而,每当收到数据时,我都需要做很多事情,包括:
- 将数据保存到我的SQL数据库中
- 在UI上更新RichTextBox
- 发回响应串行消息
我应该从myEventHandler中运行所有这些函数吗;这是正确的做法吗?问题是,例如,当我试图从myEventHandler中更改RichTextBox时,我会收到一个错误,说明我正在进行跨线程操作。
更新:
private void myEventHandler (object sender, SerialDataReceivedEventArgs e)
{
Action myAction = () => rtbMyRichTextBox.Text = InputMessageString;
if (rtbMyRichTextBox.InvokeRequired)
rtbMyRichTextBox.Invoke(myAction);
else
myAction();
StoreToSqlDatabase ();
SerialWriteResponseMessage ();
}
您应该在该事件处理程序中或在它调用的方法中执行所有这些操作。
您可以通过与UI线程同步来解决跨线程问题。如果这是Windows窗体应用程序,则需要使用InvokeRequired和Invoke。这些文档链接有很好的例子。
SerialPort.DataReceived的文档显示:
从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。由于此事件是在辅助线程而非主线程上引发的,因此尝试修改主线程中的某些元素(如UI元素)可能会引发线程异常。如果有必要修改主Form或Control中的元素,请使用Invoke将更改请求发回,Invoke将在正确的线程上完成工作。
代码看起来像:
void myEventHandler(object sender, SerialDataReceivedEventArgs e)
{
DoSqlUpdate();
this.Invoke(UpdateUI, data); // pass whatever data that needs to be updated
SendResponseMessage();
}