0

我正在编写一个 C# 应用程序以通过串行与微控制器进行通信。我有几个关于如何处理收到的消息的问题。下面是我目前使用的代码,它接收到的消息非常好,但我无法更新表单,或将数据存储在此方法之外的任何地方(因为它在另一个线程中)。

com.DataReceived += new SerialDataReceivedEventHandler(OnReceived);


public void OnReceived(object sender, SerialDataReceivedEventArgs c) // This is started in another thread...
    {
        com.DiscardOutBuffer();
        try
        {
            test = com.ReadExisting();
            MessageBox.Show(test);       
        }
        catch (Exception exc) 
        {
            MessageBox.Show(exc.ToString());
        }
    }

当我尝试更改表单或从此处调用另一个方法时,这是我收到的错误消息:“Cross Thead 操作无效”。

我希望能够在其他地方显示信息,或者甚至更好地将其放入数组中,以便以后存储为文件。有什么办法可以做到这一点吗?

再次感谢!

4

2 回答 2

1

您需要使用Invokeor调用主线程BeginInvoke

public void OnReceived(object sender, SerialDataReceivedEventArgs c)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(OnReceived), sender, c);
        return;
    }

    com.DiscardOutBuffer();
    try
    {
        test = com.ReadExisting();
        MessageBox.Show(test);       
    }
    catch (Exception exc) 
    {
        MessageBox.Show(exc.ToString());
    }
}

或者,您可以提取事件处理程序的一部分(例如显示消息框)并调用它。

于 2013-01-02T19:33:32.433 回答
1

您遇到的问题是您正在尝试从非 ui 线程更新 UI。您需要做的是MessageBox在 UI 线程上调用您的调用。

就像是:

public void OnReceived(object sender, SerialDataReceivedEventArgs c) // This is started in another thread...
{
    com.DiscardOutBuffer();
    try
    {
        test = com.ReadExisting();
        SetValue(test);       
    }
    catch (Exception exc) 
    {
        SetValue(exc.ToString());
    }
}


delegate void valueDelegate(string value);

private void SetValue(string value)
{   
    if (this.InvokeRequired)
    {
        this.Invoke(new valueDelegate(SetValue),value);
    }
    else
    {
        MessageBox.Show(value);
    }
}
于 2013-01-02T19:34:51.527 回答