一、c# Invoke和BeginInvoke的认识
1、Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念。
3、BeginInvoke() 调用时,当前线程会启用线程池中的某个线程来执行此方法,BeginInvoke不会阻止当前主线程的运行,而是等当前主线程做完事情之后再执行BeginInvoke中的代码内容,表现出“异步”的概念。
4、EndInvoke() ,在想获取 BeginInvoke() 执行完毕后的结果时,调用此方法来获取。
二、通过实例说明 c# Invoke和BeginInvoke的区别
1、实例 C# 代码 复制
private voID button1_Click(object sender,EventArgs e) { this.textBox1.Text = "1";.Invoke(new EventHandler(delegate {+=2; }));3; }
结果为:123
2、实例 C# 代码 复制 ;.BeginInvoke( 结果为: 132
3、实例 C# 代码 复制 using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.linq; System.Text; System.windows.Forms; System.Threading;namespace InvokeTest MsgDelegate(String str);//声明一个代理publicpartialclass Form1 : Form@H_268_301@{ Thread[] threads Thread[10];如果不使用关键字new出对象来,则会报“未将对象引用设置到对象的实例。”的错误 Form1(){ InitializeComponent(); } Form1_Load({ Thread.CurrentThread.name 主线程;for(int i=0;i<++){ Thread ts Thread( ThreadStart(threadProc)); ts.name 线程组成员+i.ToString()+号; threads[i] ts; ts.IsBackground true; ts.Start(); } } showMsg(String str){ Thread.Sleep(5000);线程休眠5秒... MessageBox.Show(str是在Thread.CurrentThread.name中执行的显示执行该代理函数的是哪个线程 }{ MessageBox.Show(执行A1代码段); Thread T1 Thread(threadProc1); T1.name 线程一; T1.Start(); MessageBox.Show(执行B1代码段); } button2_Click(执行A2代码段); Thread T2 Thread(threadProc2); T2.name 线程二; T2.Start(); MessageBox.Show(执行B2代码段///<summary> 线程一的线程函数</summary> threadProc1(){ Invoke( MsgDelegate(showMsg),[] { 通过Invoke调用showMsg }相当于this.Invoke,调用要消耗较长时间的代码后完了才开始执行下一条语句 MessageBox.Show(Invoke函数后调用,因为Invoke是同步执行的,所以刚才我一直在等待showMsg执行完呢,唉... 线程二的线程函数 threadProc2(){ BeginInvoke([] 通过BeginInvoke调用showMsg相当于this.BeginInvoke()调用要消耗较长时间的代码后立刻执行下一条语句BeginInvoke函数后调用,但由于BeginInvoke的异步执行,故还没等showMsg执行完我就被执行了!哈哈... threadProc(){ MessageBox.Show(Thread.CurrentThread.name 已经运行! }}
总结
以上是内存溢出为你收集整理的this.Invoke和this.BeginInvoke的区别全部内容,希望文章能够帮你解决this.Invoke和this.BeginInvoke的区别所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)