C#异步编程之async、await
在C#编程种经常听过异步编程,本文就来以一个实际案例来讲解异步编程中async、await的用法。我们要实现也给需求,点击界面按钮后,五秒后界面的Lable控件的值被赋值为“123”,下面分别介绍4种方法。
前言
在C#编程中经常听过异步编程,本文就来以一个实际案例来讲解异步编程中async、await的用法。我们要实现以下需求,点击界面按钮后,五秒后界面的Lable控件的值被赋值为“123”,下面分别介绍4种方法。
1、方法1
下面的代码中UI线程卡5秒后,label1的值被更新为“123”,最终的结果虽然实现了,但是当你点击按钮后,界面也会卡5秒。
private void button1_Click(object sender, EventArgs e)
{
Thread.Sleep(5000);
label1.Text = "123";
}
2、方法2
下面的代码由于 Task.Delay是异步任务,所以不卡阻塞UI线程,但是同时 label1也会被立即更新,所以并不能实现5秒后更新UI的功能。
private void button2_Click(object sender, EventArgs e)
{
Task.Delay(5000);//不会阻塞当前线程
label1.Text = "123";
}
3、方法3
下面的代码使用 Task.Run让任务处在线程池中运行,所以也不会卡界面,,并且延时5秒后,可以更新Lable的Text属性,这里需要注意的是因为Task.Run里面的任务已经不在UI线程了,所以需要使用委托跨线程更新界面,这个方法可以达到我们的目的而且不卡界面,但是代码量挺多。
private void button3_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
Thread.Sleep(5000);
this.Invoke(new Action(() =>
{
label1.Text = "123";
}));
});
}
4、方法4
下面的代码中,使用async关键字将方法标记为异步方法,然后使用await关键字标记一个任务,被await关键字标记的任务代码执行后,代码立即切换回调用异步方法的线程(这里是UI线程),并且不会立即执行await所在的方法中在await标记的任务之后的代码,也就是下图中的 label1.Text = “123”,这句更新界面的代码要等到await关键字标记的任务完成以后才会执行,而且执行的时候已经切换回UI线程,所以这里也不需要跨线程更新界面。所以下面的代码结合async和await关键字就可以很好的实现异步方法更新界面并且不让界面卡顿。
private async void button4_Click(object sender, EventArgs e)
{
await Task.Delay(5000);
label1.Text = "123";
}
马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)
1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》
以上教程CSDN订阅已超过2000+~
更多推荐

所有评论(0)