我定义了一个串口(C#/ .Net),然后在收到数据时分配了 SerialDataReceivedEventHandler 。
myPort.DataReceived += new SerialDataReceivedEventHandler (myEventHandler);
但是,无论何时收到数据,我都需要做多件事,包括:
我应该从 myEventHandler 中运行所有这些功能;这是正确的做法吗?问题是,例如,当我尝试从 myEventHandler 中更改 RichTextBox 时,我收到一条错误,指出我正在进行跨线程操作。< / p>
更新
private void myEventHandler (object sender, SerialDataReceivedEventArgs e)
{
Action myAction = () => rtbMyRichTextBox.Text = InputMessageString;
if (rtbMyRichTextBox.InvokeRequired)
rtbMyRichTextBox.Invoke(myAction);
else
myAction();
StoreToSqlDatabase ();
SerialWriteResponseMessage ();
}
答案 0 :(得分:1)
您应该在该事件处理程序中或在它调用的方法中执行所有这些操作。
您可以通过与UI线程同步来解决跨线程问题。如果这是Windows窗体应用程序,则要使用InvokeRequired和Invoke。这些文档链接有很好的例子。
从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。因为此事件是在辅助线程而不是主线程上引发的,所以尝试修改主线程中的某些元素(例如UI元素)可能会引发线程异常。如果有必要修改主窗体或控件中的元素,请使用Invoke发回更改请求,这将在正确的线程上完成工作。
代码看起来像:
void myEventHandler(object sender, SerialDataReceivedEventArgs e)
{
DoSqlUpdate();
this.Invoke(UpdateUI, data); // pass whatever data that needs to be updated
SendResponseMessage();
}