async:
1、标记一个方法为一异步法,可能会异步执行(没await就是普通方法)
2、该方法可被await
await:
1、await只能在async方法内使用
2、程序遇到第一个await时,会开启一个新线程执行await下方的代码(包括await这行)
async、await演示代码
public static void Main() {
Task<int> t = 方法1();
//非async方法想等待async方法的结束,可使用.Result
int num = t.Result;//等待方法1执行结束
Console.ReadLine();
}
public static async Task<int> 方法1() {
//遇到第一个await,函数直接返回,下面的代码(包括await这行)在新线程中执行
await 方法2();
//包括上面的await,await会等待async方法的执行结束
//如果这里去掉这个await,就会直接返回0,而不是等方法3执行结束再返回0
await 方法3();
return 0;
}
public static async Task<int> 方法2() {
return await Task.Run(() => {
Thread.Sleep(1000);
return 1;
});
}
public static async Task<int> 方法3() {
await Task.Delay(500);
return 0;
}
看上去与Task.Run()区别不大,但是async/await还是有其独特的优势存在
明显的优势:代码简洁,操作便利,如果用Task.Run()写,一堆的(){},可读性大大降低。
async优势之——优雅的异步更新UI线程
1、非常优雅的实现异步更新UI界面,无需使用Invoke,不会阻塞主线程,这点Task.Run做不到。
2、但是要注意死锁问题
(await会获取当前UI线程的SychronizationContext)。
3、注意await之前都还是同步
4、并且由于异步更新线程,使用链式逻辑的时候就要小心了
(比如调用下面代码后去获取textBox数据,textBox要1秒后才会被更新数据)
private async void button1_Click(object sender, EventArgs e) {
textBox1.Text = await Task.Run(() => {//不阻塞主线程更新textBox
Thread.Sleep(1000);
return "测试";
});
}
async优势之——不妨碍主线程的异步线程阻塞
不会影响到主线程,Thread.Sleep会阻塞主线程,Task.Delay是可以取消的
private async void button1_Click(object sender, EventArgs e) {
await Task.Delay(2000);//不会阻塞UI线程
//Thread.Sleep(2000);//会阻塞UI线程
textBox1.Text = await Task.Run(() => {
Thread.Sleep(1000);
return "测试";
});
}