同步&异步
既然说到异步编程那就说下异步编程和同步编程的区别。
同步:简单来说就是按顺序执行,例如登录过程必须输入用户名、密码再点击登录
第一步:输入用户名
第二步:输入密码
第三部:点击登录
这就是一个同步过程
异步:异步可以说是同时进行多个任务,相互不干扰,第二个任务的执行不需要等待第一个任务执行。
例如: 下载一个Oracle的安装包,安装过得人应该知道 Oracle的安装包一般是有两个构成,必须两个都下载然后解压在一起才可以开始安装。这里我们下载的过程肯定是不需要先下载安装包1再下载安装包2,而是一起下载,等两个都下载好了进行安装。
我们可以对比下异步和同步所需时间,还是以下载Oracle安装包为例。
假设下载安装包1需要6s,下载安装包2需要4s
同步的操作: 一.下载安装包1 二.下载安装包2 所需时间:6+4 =10s
异步的操作:同时下载安装包1安装包2(排除网络原因) 所需时间应算最长下载时间,所需时间:6s
代码实现
简单异步实现
下面我们直接用代码来呈现异步过程,用一个小demo来实现。
public partial class Form1 : Form
{
//异步编程:基于委托实现
public Form1()
{
InitializeComponent();
}
//[1]定义一个委托
public delegate int MyCalulator(int num);
//[2]根据委托实现方法
private int ExecuteTask1(int num)
{
System.Threading.Thread.Sleep(5000);
return num * num;
}
private int ExecuteTask2(int num)
{
return num * num;
}
//同步调用
private void button1_Click(object sender, EventArgs e)
{
this.label1.Text = ExecuteTask1(10).ToString();
this.label2.Text = ExecuteTask2(10).ToString();
}
//[3]异步调用
private void button2_Click(object sender, EventArgs e)
{
MyCalulator objMycal = ExecuteTask1;//定义委托变量,并引用对应方法
//1.异步调用任务 实际调用参数 回调函数 回调函数入参
IAsyncResult result =objMycal.BeginInvoke(10,null,null);
this.label1.Text = "正在计算请稍等。。。";
//2.并行执行其他任务
this.label2.Text = ExecuteTask2(200).ToString();
//3.获取异步执行结果
int r = objMycal.EndInvoke(result);
this.label1.Text = r.ToString();
}
}
异步是基于委托实现的所以我们第一步需要定义一个委托
public delegate int MyCalulator(int num);
第二步根据委托实现方法
private int ExecuteTask1(int num)
{
System.Threading.Thread.Sleep(5000);
return num * num;
}
第三部编写异步方法
private void button2_Click(object sender, EventArgs e)
{
//通过委托调用方法ExecutrTask1
MyCalulator objMycal = ExecuteTask1;//定义委托变量,并引用对应方法
//1.异步调用任务 实际调用参数 回调函数 回调函数入参
IAsyncResult result =objMycal.BeginInvoke(10,null,null);
this.label1.Text = "正在计算请稍等。。。";
//2.并行执行其他任务
this.label2.Text = ExecuteTask2(200).ToString();
//3.获取异步执行结果
int r = objMycal.EndInvoke(result);
this.label1.Text = r.ToString();
}
编写异步方法的流程在注释里都写出来了,下来重点介绍下其中的几个方法
BeginInvoke函数
IAsyncResult result =objMycal.BeginInvoke(10,null,null);
委托类型的BeginInvoke(<输入和输出变量>,AsyncCallBack callback , object ayncState)方法 :异步调用的核心
第一个参数 表示委托对应的方法实参
第二个参数 回调函数,表示异步调用结束后,自动调用的方法
第三个参数 用于向回到函数提供相关的参数信息
返回值:IAsyncResult->异步操作状态接口,封装了异步执行中的参数
在这里我们只是实现一个简单的异步,并没有使用回调方法,而是直接取了返回值。在后面的文章中会使用回调方法。
下面我们可以看下demo的运行情况
可以看到单机同步后因为第一个计算方法需求等待,所以第二个结果基本是与第一个结果同时出现的,而使用异步结果2直接被计算了出来,之后结果1经过等待时间后被计算。