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

相关推荐
消失的旧时光-19438 小时前
C++ 拷贝构造、拷贝赋值、移动构造、移动赋值 —— 四大对象语义完全梳理
开发语言·c++
送秋三十五9 小时前
一次大文件处理性能优化实录————Java 优化过程
java·开发语言·性能优化
Sylvia-girl9 小时前
线程池~~
java·开发语言
fie88899 小时前
基于MATLAB的转子动力学建模与仿真实现(含碰摩、不平衡激励)
开发语言·算法·matlab
lly2024069 小时前
C# 变量作用域
开发语言
bugcome_com9 小时前
阿里云 OSS C# SDK 使用实践与参数详解
阿里云·c#
时艰.9 小时前
java性能调优 — 高并发缓存一致性
java·开发语言·缓存
MSTcheng.9 小时前
【C++】C++智能指针
开发语言·c++·智能指针
无小道9 小时前
Qt——网络编程
开发语言·qt
wazmlp0018873699 小时前
第五次python作业
服务器·开发语言·python