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+~

相关推荐
l1t14 小时前
DeepSeek 4.1总结的Tom Lane 谈塑造 Postgres 三十年历程的架构决策
开发语言·数据库·postgresql·架构
djarmy20 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO920 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧20 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精20 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠21 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫21 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie11451419121 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉21 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
秦老师Q1 天前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php