C#同步、异步编程
同步编程
public partial class Form1 : Form { public Form1() { InitializeComponent(); } //同步执行 private void btnExcu_Click(object sender, EventArgs e) { lab1.Text = add(10,10).ToString(); lab2.Text = jianf(10, 10).ToString(); } private int add(int a,int b) { return a + b; } private int jianf(int a,int b) { //调用thread类中的Sleep()方法来给方法2延迟5000毫秒 System.Threading.Thread.Sleep(5000); return a * b; }
效果如下:
代码分析:
当我点击同步显示的时候,由于方法2延迟了5000毫秒,所有label1和label2会等待5000毫秒后在一同显示,其他的按钮点之没有反应。
异步显示 public partial class Form1 : Form { //【1】定义委托 public delegate int adddelegate(int a,int b); public Form1() { InitializeComponent(); } //同步执行 private void btnExcu_Click(object sender, EventArgs e) { lab1.Text = add(10,10).ToString(); lab2.Text = jianf(10, 10).ToString(); } //【2】根据委托定义委托方法 private int add(int a,int b) { return a + b; } private int jianf(int a,int b) { //调用thread类中的Sleep()方法来给方法2延迟5000毫秒 System.Threading.Thread.Sleep(5000); return a * b; } //【3】异步调用 private void btnExcu2_Click(object sender, EventArgs e) { //通过委托异步调用方法 //委托类型的BeginInvoke(输入和输出变量) //第一个参数10 表示委托方法的实参。 //第二个参数Callback:回调函数,表示异步调用后自动调用的函数 //第三个参数AsyncState:用户向回调函数提供参数信息 //返回值:IAsyncResult:异步操作状态接口,封装了异步执行的参数 //创建委托变量,并指向方法 adddelegate my = jianf; //异步调用任务 需要用到接口IAsyncResult IAsyncResult resul = my.BeginInvoke(10,10,null,null); this.lab1.Text = "正在计算,请稍等..."; //同时执行其他任务 this.lab2.Text = add(10,10).ToString(); //获取异步执行的结果 EndInvoke返回一个int类型 参数是接口 //委托类型的EndInvoke()方法:借助于IAsyncResult接口对象,不断的查询异步调用是否结束。 int re= my.EndInvoke(resul); this.lab1.Text = re.ToString(); } }