C#异步编程之async、await

前言

在C#编程种经常听过异步编程,本文就来以一个实际案例来讲解异步编程中async、await的用法。我们要实现也给需求,点击界面按钮后,五秒后界面的Lable控件的值被赋值为"123",下面分别介绍4种方法。

1、方法1

下面的代码中UI线程卡5秒后,label1的值被更新为"123",最终的结果虽然实现了,但是当你点击按钮后,界面也会卡5秒。

csharp 复制代码
   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线程了,所以需要使用委托跨线程更新界面,这个方法可以达到我们的目的而且不卡界面,但是代码量挺多。

csharp 复制代码
  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关键字就可以很好的实现异步方法更新界面并且不让界面卡顿。

csharp 复制代码
   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+~

相关推荐
为何创造硅基生物3 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好3 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李3 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆4 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
cen__y5 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人6 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生6 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS6 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言