【问题标题】:How to handle multiple actions when Serial Port data received收到串口数据时如何处理多个动作
【发布时间】:2013-07-10 20:42:20
【问题描述】:

我定义了一个串行端口 (C# / .Net),然后为每当接收到数据时分配一个 SerialDataReceivedEventHandler

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 ();
}

【问题讨论】:

    标签: c# .net serial-port


    【解决方案1】:

    您应该在该事件处理程序中或在它调用的方法中执行所有这些操作。

    您通过与 UI 线程同步来解决跨线程问题。如果这是一个 Windows 窗体应用程序,您希望使用 InvokeRequiredInvoke。这些文档链接有很好的例子。

    SerialPort.DataReceived 的文档说:

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

    代码如下所示:

    void myEventHandler(object sender, SerialDataReceivedEventArgs e)
    {
        DoSqlUpdate();
        this.Invoke(UpdateUI, data);  // pass whatever data that needs to be updated
        SendResponseMessage();
    }
    

    【讨论】:

    • 我上面的更新怎么样?
    • @boardbite:应该可以。虽然你可以使用this.InvokeRequiredthis.Invoke
    • 注意到了。跨线程问题是否仅与 UI 更新 线程有关?或者我是否会遇到跨线程问题以及 SQL 数据库通信 在单独的线程上运行,而 Serial Write 在另一个线程上运行?
    • @boardbite:我不希望您在使用串行端口时遇到问题,当然前提是您没有两个线程同时发送数据。这可能会导致问题。如果您的更新总是打开和关闭一个新的连接,您将不会遇到 SQL Server 的问题。我对 SQL Server 的了解不够,不知道您是否可以使用来自多个线程的单个连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多