Invoke机制?界面卡死原因 Invoke 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.cnblogs.com/sufei/p/3145333.html displayInfo里只是简单的对界面上的TextBox进行更新,显示串口接收到的数据 不知道Invoke委托的方法执行完毕后是不是要通知调用Invoke的线程(即引发sp1_DataReceived事件的线程),而sp1又被关闭了,导致通知对象无响应,于是界面卡死。这也只是我的猜想 当SerialPort关闭的时候,displayInfo里面报错了。但很不幸又被你catch了,所以错误没显示,只是一直假死。 问题不在这。。displayInfo里是没有错误的,而且如果被catch的话,我在catch那加了MessageBox,并无消息框显示。 不要用ivoke,invoke还是在同一线程,用begininvoke Invoke是委托到主线程上的不然就会出现跨线程错误了,只是Invoke是同步委托,BeginInvoke是异步委托 曹版主,帮忙解答下,前两天在另外个帖子看到你对Invoke的解释,但没看到更多的了Invoke是怎么执行的,执行完毕后是不是通过消息传递什么的displayInfo里的东西很简单,就是像textBox1.Text=Speed.ToString()这种,而Speed是Int型的类成员 关闭sp1的时候会造成界面卡死,我想知道原因是什么,是对UI的抢占造成死锁?执行sp1.Close()也会对UI进行抢占吗?程序卡死之后,全部中断发现卡在“sp1.Close()”解决卡死的问题就是加个while(listening) Application.DoEvents();bool closePort=false,listening=false;private void btnOpen_Click(object sender, EventArgs e){ if (btnOpen.Text == "开始监测") { sp1.Open(); closePort = false; sp1.Write(inquireCommand, 0, 4); btnOpen.Text = "停止监测"; } else if (btnOpen.Text == "停止监测") { closePort = true; while (listening) Application.DoEvents(); sp1.Close(); btnOpen.Text = "开始监测"; }} private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e){ listening=true; ... this.Invoke(new EventHandler(displayInfo)); listening=false;}private void displayInfo(object sender, EventArgs e){ textBox.text=speed.ToString();}} 谢谢这个帖子解决了我的问题,我试了下Invoke和BeginInvoke都能正常运行,到底用哪个好点呢?我给你留言了! BeginInvoke是异步调用,如果你在调用之后不需要什么其他的反馈,同时又想继续执行下面的代码,可以使用异步调用 虽然没有满意答案,还是结贴给分吧,我猜测是辅助线程和主线程对UI抢占造成界面卡死。辅助线程里对UI进行操作,而主线程里对SerialPort执行Close操作,造成界面卡死。解决办法我已经在上面贴出来了。 请问.net中是否有ssh组件 求一个正则表达式 DataGridViewColumn 应用问题~速! C#中C/S与B/S开发的不同点(不是单纯概念的不同) c#中“this作为方法名表示构造函数”怎么理解 float转string 一段VB语句翻译成C# c# 如何使DATAGRID中选定的行滚动到可见范围中 listbox中items的值如何转换成int参与运算? 关于C#委托解释 dev中gridview的RepositoryItemPopupContainerEdit
displayInfo里只是简单的对界面上的TextBox进行更新,显示串口接收到的数据
不知道Invoke委托的方法执行完毕后是不是要通知调用Invoke的线程(即引发sp1_DataReceived事件的线程),而sp1又被关闭了,导致通知对象无响应,于是界面卡死。这也只是我的猜想
所以错误没显示,只是一直假死。
问题不在这。。displayInfo里是没有错误的,而且如果被catch的话,我在catch那加了MessageBox,并无消息框显示。
Invoke是委托到主线程上的不然就会出现跨线程错误了,只是Invoke是同步委托,BeginInvoke是异步委托
曹版主,帮忙解答下,前两天在另外个帖子看到你对Invoke的解释,但没看到更多的了
Invoke是怎么执行的,执行完毕后是不是通过消息传递什么的displayInfo里的东西很简单,就是像textBox1.Text=Speed.ToString()这种,而Speed是Int型的类成员
执行sp1.Close()也会对UI进行抢占吗?程序卡死之后,全部中断发现卡在“sp1.Close()”
解决卡死的问题就是加个
while(listening)
Application.DoEvents();
bool closePort=false,listening=false;
private void btnOpen_Click(object sender, EventArgs e)
{ if (btnOpen.Text == "开始监测")
{
sp1.Open();
closePort = false;
sp1.Write(inquireCommand, 0, 4);
btnOpen.Text = "停止监测";
}
else if (btnOpen.Text == "停止监测")
{
closePort = true;
while (listening)
Application.DoEvents();
sp1.Close(); btnOpen.Text = "开始监测";
}
} private void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
listening=true;
...
this.Invoke(new EventHandler(displayInfo));
listening=false;
}private void displayInfo(object sender, EventArgs e)
{
textBox.text=speed.ToString();
}}
我给你留言了!