函数执行时间过长,导致Winform界面无响应

具体代码:publicdelegatevoidybb();privatevoidsp_DataReceived(objectsender,System.IO.Ports.... 具体代码:
public delegate void ybb();
private void sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
ybb ybb2 = new ybb(ybb1);
BeginInvoke(ybb2);
}
public void ybb1()
{
try
{
int ili = sp.BytesToRead;
byte[] s = new byte[ili];
sp.Read(s, 0, s.Length);
ckbind(s);
}
catch
{ }
}
当数据量过大时函数 ckbind(s)执行的时间有点儿长,导致Winform界面瞬间就无响应了,有什么办法解决啊?

请各位大哥大姐帮帮忙啊!
展开
 我来答
lzh3452
推荐于2017-09-30 · TA获得超过1044个赞
知道小有建树答主
回答量:1168
采纳率:100%
帮助的人:860万
展开全部
有两种简单地方法可以解决这个问题。
1.使用多线程,把ckbind处理放到子线程里,就不会影响主窗体响应系统事件了,也就不会无响应了,有心的话,还可以做成主窗体不可用,再来个进度条,让人一看就知道在执行一个很长的处理,而且程序还在运行中。
2.在ckbind里如果是循环导致的事件过长,可以在循环固定次数时,调用Application.DoEvent();方法,使程序响应一次系统事件,虽然看不出程序动,但是肯定不会无响应,因为系统判定无响应是只一定时间内,程序不能响应系统事件,所以在这个时间到达之前响应一次,就不会有无响应的问题了。
脑海橡皮擦1
2013-01-17
知道答主
回答量:32
采纳率:0%
帮助的人:12.7万
展开全部
强制关机,就是一直按着主机上的开机键。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
哲事姓无
2013-01-17 · TA获得超过1176个赞
知道小有建树答主
回答量:903
采纳率:100%
帮助的人:443万
展开全部
sp_DataReceived是在非界面线程中运行的吧。

将ckbind的部分也放在后台线程,不要太早调用BeginInvoke将调用转换至界面纯种。仅在需要设置界面的时候调用BeginInvoke或是Invoke
更多追问追答
追问
sp_DataReceived是窗口上的SerialPort串口组件的事件

ckbind函数:
public delegate void CKBind(byte[] by);
public void ckbind(byte[] by)
{
if (flowLayoutPanel1.InvokeRequired)
{
CKBind d = new CKBind(ckbind);
Invoke(d, by);
}
else
{
try
{...
追答
没用过SerialPort控件,估计sp_DataReceived有可能在界面线程中触发的。如是你确定知道ckbind太耗时间的话那把你的else后的那部分代码也贴一下看看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bxfc
2013-01-17 · TA获得超过872个赞
知道小有建树答主
回答量:1104
采纳率:0%
帮助的人:683万
展开全部
用异步+委托

异步执行函数,完成时调用委托通知UI。UI响应完成事件。
追问
我要在函数ckbind(s)中对收到的字符串进行分析,然后向flowLayoutPanel中添加UserControl控件来显示结果,还有一些其他地方的数据绑定等,该怎么完成您说的“函数完成时调用委托通知UI。UI响应完成事件”这一过程啊,您能介绍详细一点儿吗
追答
你分析一下你的整体过程,将相应的操作整理出来。
哪些可以异步,哪些可以同步。
我简单的来说一下:字符串解析可以异步去做,添加UserControl这个只能同步,数据绑定的更新也只能同步。

简单点来说就是让你利用多线程去做
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
流言菲语123456
2013-01-17 · TA获得超过222个赞
知道答主
回答量:268
采纳率:0%
帮助的人:62.8万
展开全部
在运行结束时,将对象删除,不太确定,学的是C
来自:求助得到的回答
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式