MSDN:从SerialPort对象接收数据时,将在辅助线程上引发DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke回发更改请求,这将在正确的线程上执行.
进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现
下面是代码实例:
private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e) { intSDateTemp = this.serialPort1.ReadByte();//读取串口中一个字节的数据 this.tB_ReceiveDate.Invoke( //在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate) //即在textBox_ReceiveDate控件的父窗口form中执行委托. newMethodInvoker( //表示一个委托,该委托可执行托管代码中声明为 void且不接 //受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时 //或需要一个简单委托又不想自己定义时可以使用该委托。 delegate{ //匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整 //代码区块当成参数传递的程序代码编写技术,通过此种方法可 // 以直接使用委托来设计事件响应程序 //以下就是你要在主线程上实现的功能,但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机 //制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响 //应不顺畅,这时你的主form界面会延迟或卡死 this.tB_ReceiveDate.AppendText(SDateTemp.ToString());//输出到主窗口 // 文本控件 this.tB_ReceiveDate.Text += " "; } ) ); } |
实例在VS2008中通过
email:wanglei_wan@yahoo.com.cn