C# asnyc和await

news2024/9/19 10:13:36

asnyc和await是什么?

异步编程是一种编程范式,C#中的异步编程可以通过Thread,TheadPool,Task,async/await等来实现。

await能等待什么?

不能等待同步代码,只能等待Task或异步方法,且异步方法必须有返回值,

async/await的出现:

C#5(.NET4.5)引入的语法糖
C#7.1,Main入口也可以
C#8.0,可以使用异步流await,foreach可以释放对象await using

asnyc:

async 是一个修饰符,用于声明一个方法、lambda表达式或者匿名方法为异步的。

异步方法通常用于执行可能需要很长时间的操作,比如I/O操作(文件读写、网络请求等),而不会阻塞当前线程。

使用 async 修饰的方法必须有返回值,可以是 TaskTask<T> 或者 void(在C# 7.3及以后版本中,void 异步方法是不推荐的,因为它不能使用 await)。

await:

await 是一个操作符,用于等待一个异步操作完成,而不会阻塞当前线程。

await 只能在标记为 async 的方法内部使用。

当执行到 await 表达式时,控制权会返回给调用者,直到被 await 的任务完成。当任务完成后,执行会从 await 表达式之后的代码继续进行。

public async Task<string> GetDataAsync()
{
    // 模拟异步操作
    await Task.Delay(1000); // 等待1秒
    return "Data";
}

public async void UseAsyncMethod()
{
    string data = await GetDataAsync(); // 使用await等待GetDataAsync完成
    Console.WriteLine(data);
}

async/await优点

  1. 代码可读性:使用 async 和 await 可以使异步代码看起来和同步代码非常相似,提高了代码的可读性。
  2. 避免回调地狱:传统的异步编程通常使用回调函数,这可能导致代码结构复杂,难以理解和维护。async 和 await 避免了这种情况。
  3. 更好的错误处理:异步方法可以像同步方法一样使用 try-catch 块来处理异常。
  4. 提高性能:通过异步编程,应用程序可以在等待I/O操作完成时继续执行其他任务,从而提高应用程序的响应性和吞吐量。
  5. 简化异步编程:开发者可以编写更少的代码来实现异步逻辑,因为 async 和 await 抽象了很多底层的复杂性。

 总结:1.既要有顺序,又要不阻塞,降低了编程难度 2.以同步编程的方式来写异步

 定义异步方法、再方法返回值前 添加async关键字

public void Sayhello1()
{
    Console.WriteLine("同步的方法");
}
public async void Sayhello2()
{
    Console.WriteLine("异步方法");
}

单独使用async,不使用await,警告缺少 await运算符,不是真正的异步方法

但Await不能等待同步代码,只能等待task或异步方法

 

await必须等待结果,没结果不能等待(无法等待void),要求:Task或其它的异步方法必须有返回值

正确的

Await直接等待结果不行,结果不是task或异步方法

单独使用await,不使用async,报错。

记住原则:有async地方必须有await,反之也是。

带返回值的异步方法可以使用await等待。

       public async Task Sayhello3(string a)
       {
           //await Console.WriteLine("同步的方法");
           Task<string> task = new Task<string>(() =>
           {
               return "hello";
           });
           await task;

       }
       private async void button1_Click(object sender, EventArgs e)
       {
           await Sayhello3("xixi");
       }

异步方法带返回值的:必须返回Task,Task<T>

public async Task Sayhello3(string a)
{
    Task<string> task = new Task<string>(() =>
    {
        return "hello";
    });
    await task;
}

调用异步方法,await不会阻塞

private async void button1_Click(object sender, EventArgs e)
{           
       Sayhello3("xixi2");//直接调用不建议
       await Sayhello3("xixi");//Wait()方法会阻塞,await不会阻塞
}

 异步方法不带返回值,真正的异步方法

异步方法没有返回值,不可以等待,不等待时,异步执行。

private void button1_Click(object sender, EventArgs e)
{
    调用
    Sayhello4();
}
private async void Sayhello4()
{
    Task t = Task.Run(() =>
    {
        Thread.Sleep(1000);
        Console.WriteLine("hello world");
    });
    await t;
}

规律:返回Task的不需要return,只需要await。

返回Task<T>的必须有await和return。

调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

遇到BUG怎么分析,全方位带你分析

软件测试的目的是尽可能早地找出软件产品中潜藏的缺陷&#xff0c;并确保其得以修复。所以缺陷的分析就会变得很关键&#xff0c;那么如何来分析缺陷呢&#xff1f; 根据缺陷的定义描述准则&#xff1a; 所有不满足需求或超出需求的都是缺陷。缺陷的判定主要的依赖点在于产品…

配置oss cdn加速静态资源访问 阿里云

效果对比 配置cdn下载速度对比 步骤 1: 登录阿里云控制台控制台主页&#xff0c;找到并点击“对象存储 OSS” 创建存储空间&#xff08;Bucket&#xff09; 设置权限 步骤 2: 获取外网访问地址 步骤 3 在 CDN 中使用该地址 复制该外网访问地址 打开全站加速 DCDN/域名管理 添…

【LeetCode热题100】双指针

class Solution { public:void moveZeroes(vector<int>& nums) {int dst -1,cur 0;while(cur<nums.size()){if(nums[cur] 0){cur;}else{swap(nums[dst1],nums[cur]);cur;dst;}}} }; 题目分析&#xff1a;对于数组分块/数组划分的问题&#xff0c;我们可以使用双…

Jmeter请求发送加密参数详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近在做http加密接口&#xff0c;请求头的uid参数及body的请求json参数都经过加密再发送请求&#xff0c;加密方式为&#xff1a;ase256。所以&#xff0c;jmeter…

社区志愿者服务系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

【AI落地应用实战】Amazon SageMaker JumpStart 体验零一万物的 Yi 1.5 模型

目录 一、前言1.1、Amazon SageMaker JumpStart1.2、Yi-1.5 9B Chat 模型 二、Yi 1.5实践流程2.1、准备SageMaker Studio环境2.2、部署Yi-1.5-9B模型2.3、运行推理Yi-1.5-9B模型 三、体验总结 中国大模型公司零一万物发布开源大模型Yi-1.5&#xff0c;包含多个版本。同时发布多…

YOLOv8轻量化改进之slimneck

目录 一、原理 二、代码 三、修改到YOLOv8中 四、yaml文件修改 一、原理 论文地址:2206.02424 (arxiv.org) 主要模块的网络结构 二、代码 slimneck的代码如下,slimneck主要由GSConv和VoVGSCSPC两部分组成。 class GSConv(nn.Module):# GSConv https://github.com/Alan…

分布式高可用架构设计

一、限流 1、单机限流 如图&#xff0c;应用C的资源c/x被上游的应用A和应用C并发访问&#xff0c;应用C的系统能力支持c/x资源最高5000/qps的访问量&#xff1b;为了不让高并发流量或尖峰流量压垮应用C&#xff0c;可以针对应用C的资源c/x做限流&#xff1b;比如设置限流4500…

为什么会有浮毛猫毛?这些不容忽视的危害宠物空气净化器能解决!

很多人看到朋友家可爱的猫猫狗狗&#xff0c;自己也心痒痒想要养一只。但一想到宠物可能会带来的掉毛、体臭等问题&#xff0c;又犹豫不决。诚然&#xff0c;养宠物确实会对室内空气造成一定影响&#xff0c;但养宠人的共识是&#xff1a;那份与宠物共度的快乐时光&#xff0c;…

mysql索引探索

《令人困惑的mysql索引》在这篇文章中&#xff0c;遗留了几个困惑。为了解决这些困惑&#xff0c;我又进行了一些测试。 本文中索引的建立&#xff0c;并不一定科学&#xff0c;查询的SQL也不一定科学&#xff0c;只是为了理解mysql索引建的一些测试数据。 CREATE TABLE cms_…

加密与安全_双向RSA+AES加密及Code实现

文章目录 AES / RSA流程Code生成AES密钥 和 生成RSA密钥对AES工具类&#xff0c;提供AES加密和解密功能RSA加密工具类测试类 总结 AES / RSA AES&#xff1a;一种对称加密算法&#xff0c;意味着加密和解密使用相同的密钥。速度快&#xff0c;适合加密大量数据。RSA&#xff1…

Tina-Linux Bootloaer简述

Tina-Linux Bootloaer简述 目录介绍 ubuntuubuntu1804:~/tina-v2.0-sdk/lichee/brandy-2.0$ tree -L 1 . ├── build.sh ├── opensbi ├── spl //boot0 ├── spl-pub //boot0 ├── tools └── u-boot-2018 /ubootTina-Linux 启动流程简述

ant design pro v6 如何做好角色管理

先上图&#xff1a; 整个角色管理是如何做的吗&#xff1f; 首先你要处理后端&#xff0c;要先把角色存到用户那。 这是用户管理部分的内容&#xff1a; 可以看到一个用户是有多个角色的。 看到没有&#xff0c;存的是数组 数组的是一个 role 对象 role 对象是这样&#xf…

reactive 和 ref 的区别和联系

在 Vue3 的组合式 API &#xff08;Composition API&#xff09;中&#xff0c;ref 和 reactive 是用于创建响应式数据的两个核心函数。尽管二者都用于实现响应式数据&#xff0c;但在使用方式和适用场景上存在一些区别。 1. 基本概念 1.1 ref 用途&#xff1a;用于定义 基本…

深入探讨视频美颜SDK:直播美颜工具的核心技术与实现

本篇文章&#xff0c;笔者将深入探讨视频美颜SDK的核心技术及其在直播美颜工具中的实现。 一、视频美颜SDK的核心技术 视频美颜SDK通过一系列复杂的算法和技术&#xff0c;实时处理视频流并应用各种美颜效果。这些核心技术主要包括以下几个方面&#xff1a; 1.人脸识别与追踪…

【Hot100】LeetCode—24. 两两交换链表中的节点

目录 1- 思路四指针 2- 实现⭐24. 两两交换链表中的节点——题解思路 3- ACM 实现 原题连接&#xff1a;24. 两两交换链表中的节点 1- 思路 四指针 定义 dummyHead&#xff1a;便于处理头结点① cur 指针&#xff0c;记录两个交换节点的前 前一个结点② 第一个指针 first③ 第…

嵌入式开发--STM32G030C8T6,写片上FLASH死机CFGBSY和写入出错

故障现象1 G0系列&#xff0c;写片上FLASH时&#xff0c;经常死机&#xff0c;而且按复位键都没用&#xff0c;属于不断电都救不回来的那种死法。这种情况一般是由硬件置位了某个标志导致&#xff0c;只有断电才能故障复原。 故障查找 检查FLASH的相关寄存器&#xff0c;发现…

【秋招笔试】8.18大疆秋招(第一套)-后端岗

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

树莓派Pico C/C++ 开发环境搭建(一键完成版)

树莓派Pico C/C 开发环境搭建(一键完成版) 因为之前使用过MicroPython开发过树莓派Pico&#xff0c;总觉得用起来怪怪的。正好最近树莓怕发布了新一代的MCU——RP2350&#xff0c;之前的RP2040在各个平台都有所降价&#xff0c;因此&#xff0c;买了几块。同时因为之前是玩stm…

【系统架构设计】系统分析与设计方法

【系统架构设计】系统分析与设计方法 定义问题与归结模型问题分析因果鱼骨图 帕累托图上下文范围图 问题定义 需求分析与软件设计结构化分析与设计结构化分析DFD数据字典技术 结构化设计结构图程序流程图和盒图 模块设计 面向对象的分析与设计用户界面设计 定义问题与归结模型…