public FrmCalllBack()
{
InitializeComponent();
//【4】初始化委托变量
this.objMyCal = new MyCalculator(ExecuteTask);
//也可以直接使用Lambda表达式
this.objMyCal = (num, ms) =>
{
System.Threading.Thread.Sleep(ms);
return num * num;
};
}
【1】声明一个委托
public delegate int MyCalculator(int num, int ms);
【2】根据委托定义一个方法
/// <summary>
/// :返回一个数的平方
/// </summary>
/// <param name="num">基数</param>
/// <param name="ms">延迟的时间:秒</param>
/// <returns></returns>
private int ExecuteTask(int num, int ms)
{
System.Threading.Thread.Sleep(ms);
return num * num;
}
【3】创建委托变量(因为异步函数和回调函数都要用,所以定义成员变量)
private MyCalculator objMyCal = null;
【5】同时执行多个任务
private void btnExec_Click(object sender, EventArgs e)
{
for (int i = 1; i < 11; i++)//产生10个任务
{
//开始异步执行,并封装回调函数 objMyCal.BeginInvoke(10 * i, 1000 * i, null, i);
objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
//最后一个参数 i 给回调函数的字段AsyncState赋值,如果数据很多可以定义成类或结构
}
}
【6】回调函数
private void MyCallBack(IAsyncResult result)
{
int res = objMyCal.EndInvoke(result);
//异步显示结果:result.AsyncState字段用来封装回调时自定义的参数,object类型
Console.WriteLine("第{0}个计算结果为:{1}", result.AsyncState.ToString(), res);
}
异步编程总结:
- 异步编程是建立在委托基础上的一种编程方法。
- 异步调用的每个方法都是在独立的线程中执行。因此,本质上就是一种多线程程序,也可以说是一种“简化版本”的多线程技术。
- 比较适合在后台运行较为耗费时间的《简单任务》,并且任务要求相互独立,任务中不应该有代码直接访问可视化控件。
- 如果后台任务要求必须按照特定顺序执行,或者必须访问共享资源,则异步编程不适合,而应该直接采用多线程开发技术。