2013-01-02 55 views
0

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

当我试图改变形式,或者从这里这个调用另一个方法是我收到错误消息:“跨THEAD操作无效”。

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

谢谢!

回答

1

您需要调用使用InvokeBeginInvoke在主线程:

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

或者你可以将事件处理程序(如显示一个消息框)的一部分,并援引代替。

+0

这完美地工作,谢谢!调用完成的是什么? – Bubo

+0

@VRKnight它告诉主(GUI)线程执行你的代码,而不是后台线程。只有GUI线程才允许修改GUI(例如通过显示消息框),所以这是必要的。 –

1

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

喜欢的东西:

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); 
    } 
} 
+0

这两个答案都起作用,这对于Invoke意味着什么? – Bubo

+0

这里有一点点阅读,但基本上,它意味着在UI控件拥有或所属的线程上执行所请求的代码。在技​​术上,你可以在不调用(通过禁用调试器设置)的情况下做你想做的事情,但它不安全,所以调用确保跨线程正确执行。 http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx –