begininvoke(控制中的invoke和begininvoke的区别)

begininvoke(控制中的invoke和begininvoke的区别)

需求:主线程显示,其他线程数据通信与处理,数据通信处理的进度需要反映到主界面(进度条或者Text文档中)。

实现思路:

1.最开始的时候,不懂多线程操作,直接采用For或者While循环,数据通信与处理以及显示界面都放在主线程之下。导致的结果:数据处理的过程中,主界面卡死。最最简单的方式:采用Application.DoEvents()函数,如下所示:

forint 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)//(要委托的方法)
{

   
begininvoke(控制中的invoke和begininvoke的区别)
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

(0)
上一篇 2023-10-14 16:30
下一篇 2023-10-14 18:30

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注