解决方案 »
- C#如何创建带对象参数的回调函数并注册到C++DLL中
- 关于trackBar与numericUpDown联动,值改变时的问题。
- 一个朋友正在考试中,有两个题目,10点前给出答案 1个100分啊 呵呵
- 在vs2005中,用DATAGRIDVIEW显示数据库中数据,然后又新加一列COLUMN(数据库中无此列),请教大家!
- test
- 求助: C#里为什么不能新建类和窗口了?
- 我做的C# Windows应用程序感觉字体都很小,怎么让字体变大呢?比如说MainMenu中的字体
- 郁闷!邮件发送问题
- :在winform中,在activated事件中加入"textBox1.focuts()"没有效果??
- 能不能给一个往ACCESS库里面添加记录的例子?
- C#可以开发驱动程序吗
- C#_大家帮我看看代码,关于class作为实参不能改变,为什么?
{
textBox1.Text=textBox1.Text+"ABCDE\r\n"; //注意,这一行改为使用委托更新界面效果一样。
MessageBox.Show("Data Received!");
} textBox1.Text=textBox1.Text+"ABCDE\r\n"; 注意,这一行改为使用委托,并且要使用异步调用BeginInvoek,不要同步进行调用.
之所以这么问是因为有时候单独开的线程如果抛出异常,
在vista里面是悄悄给隐藏起来不显示的。
我也不知道为什么。有的时候能碰到有的时候又不出现。我觉得不用BeginInvoke, 如果系统是XP, 是会报一个InvalidOperationException的。
而又因为是单独开的线程, 异常被吃掉了。
所以毫无反应。不过CE我就不知道会不会有一样的问题了。
组件中是有一个UDP的线程,但在组件的事件中是没有独立的线程的,就是触发事件后更改界面而已。这个组件类似SerialPort组件,我上面代码里的 dataReceiver_DataReceived 事件是在另一个项目中的,另一个项目使用了DataReceiver组件,不是和DataReceiver在一起的。问题发生在使用DataReceiver组件的工程中。
我感觉你的事件是挂在了OnDataReceived上面。
而OnDataReceived是在Start里面处理的
Start又在thdReceive线程里面。
所以跨线程操作控件了。所以我才怀疑了下会不会有异常。
如果是挂在OnDataReceived上面,那怎么还会在使用组件的窗体上触发事件呢?所以我觉得不应该是这个原因……
你可以通过 分别在OnDataReceived方法和主窗体中调用 Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString);来比较就可以确定它们是否属于同一个线程了.另外你在SerialPort组件中调用委托的同步方法去更新界面就有可能会发生死锁,具体原因倒是没研究清楚,不过在改用异步调用之后就正常了.
textBox1.Text=textBox1.Text+"ABCDE\r\n";
的话,程序是正常跑的,这一句换成委托也跑不了,进到委托里执行这一句时同样阻塞住了。
{
this.Invoke();//传你的委托进去。如果Form上没有invoke方法,就把this换成textbox1
}