大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说begininvoke(控制中的invoke和begininvoke的区别),希望您对编程的造诣更进一步.
需求:主线程显示,其他线程数据通信与处理,数据通信处理的进度需要反映到主界面(进度条或者Text文档中)。
实现思路:
1.最开始的时候,不懂多线程操作,直接采用For或者While循环,数据通信与处理以及显示界面都放在主线程之下。导致的结果:数据处理的过程中,主界面卡死。最最简单的方式:采用Application.DoEvents()函数,如下所示:
for(int temp=0;temp<length;temp++)
{
Process.Value += 1;
Application.DoEvents();
}
上述为最开始采用的方式,相当于在For循环中,主线程会检查一下界面组件的更新。效果为当你点击界面控件时,会有比较大的延时。体验相当差。
2.之后开始接触多线程,委托,回调等,开始逐步改进写法:
先说说我对这个概念的个人理解,多线程可以理解为并行操作,在主线程运行的同时,有多个线程在执行自己的任务;委托,我理解为类似C语言中的函数指针;回调:我理解为一个通知,告诉主线程我要对主界面UI进行控制了。
委托例子:private delegate void UpdateProcessControl (parameter); (委托声明)
private void UpdateProcessValue (parameter); (委托方法)
其中委托声明和委托方法的parameter相同。
public delegate void UpdateProcessControl(int value);//(声明一下)
UpdateProcessControl update_process;//(定义)
Thread new_task;//(定义一个线程)
private void UpdateProcessValue(int value)//(要委托的方法)
{
Process.Value = value;
}
private void run_task(string name) //(后台需要执行的任务)
{
int length = 60000;
for(int temp=0;temp<length;temp++)
{
this.Invoke(update_process,temp);
//this.BeginInvoke(update_process,temp);
}
new_task.Abort();
}
private void Button_Click(object sender, EventArgs e)
{
update_process = new UpdateProcessControl(UpdateProcessValue);//将委托关联
new_task = new Thread(()=>run_task("test"))//Lamda 表达式可以创建一个传递多个参数的线程
new_task.IsBackground = true;
new_task.Start();
}
上述只是一个大概的例子。例子中Invoke和BeginInvoke的区别:Invoke是在回调执行完之后该线程才会继续运行,就是有可能会阻塞。BeginInvoke不是这样,不会等待回调执行,线程就会继续运行,不会阻塞。
以上是我的理解,分享一下。希望对大家有用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/25792.html