回调函数:
1.通过委托异步调用方法
2.委托类型的Begininvoke(<输入和输出变量>,AsyncCallBack CallBack,Object asyncState)方法
3.返回值:IAsyncResult-->异步操作状态接口,封装了异步执行中的参数。
4.委托类型的EndInvoke()方法:借助于IAsyncResult接口对象,不断查询异步调用是否结束。该方法之道被异步调用的方法所有参数,异步调用完毕后,取出异步调用结果作为返回值。
5.
//3.获取异步执行结果
int r = objMyCal.EndInvoke(result);
this.lblInfo1.Text = r.ToString();
int r = objMyCal.EndInvoke(result);这一段会不断询问结果,结果出来之前不会执行下一段代码;
******************************************例程***************************************************************
//同步执行
private void btnTest1_Click(object sender, EventArgs e)
{
this.lblInfo1.Text = ExecuteTask1(10).ToString();
this.lblInfo2.Text = ExecuteTask2(20).ToString();
}
//异步执行
private void btnTest2_Click(object sender, EventArgs e)
{
//定义委托变量
MyCalculator objMyCal = ExecuteTask1;
//1.异步调用任务
IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
this.lblInfo1.Text = "正在计算请稍等......";
//2.可以并行执行其他任务
this.lblInfo2.Text = ExecuteTask2(20).ToString();
//3.获取异步执行结果
int r = objMyCal.EndInvoke(result);
this.lblInfo1.Text = r.ToString();
}
//根据委托定义方法
private int ExecuteTask1(int num)
{
Thread.Sleep(5000);
return num * num;
}
private int ExecuteTask2(int num)
{
Thread.Sleep(8000);
return num * num;
}
}
//定义委托
public delegate int MyCalculator(int num);