首页 > 编程语言 >C# asnyc和await

C# asnyc和await

时间:2024-08-21 18:54:48浏览次数:9  
标签:异步 Task C# void await asnyc async 方法

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。

调用

标签:异步,Task,C#,void,await,asnyc,async,方法
From: https://blog.csdn.net/2302_77639120/article/details/141335497

相关文章

  • Vue 学习 Ref shallowRef triggerRef customRef (Ref 和 Reactive的对比)
    RefshallowReftriggerRefcustomRef针对对象(引用类型)来说:Ref:深层次的检查后面的对象的每一层是否改变,会改变值,且页面渲染shallowRef:浅层次的检查对象内,想要修改必须要要对.value对象进行重新赋值obj.value.name='456'//这种方式只会让对象值更改,但不会让页面重新渲染,......
  • canal同步mysql,监听单实例,多实例配置
    1、下载canal安装包canal.adapter-1.1.7.tar.gzcanal.deployer-1.1.7.tar.gz2、修改涉及的文件canal_deployer:/conf/canal.properties/conf/example/instance.propertiescanal_adapter:/conf/application.yml/conf/rdb在rdb中添加对应的数据配置表,即便监听多个mysq......
  • POLIR-Society-Organization-Management:Transform Business Skills with Proven Simu
    CapsimManagementSimulations,Inc.PrivacyPolicyTermsAccessibilityPolicyTransformBusinessSkillswithProvenSimulationandAssessmentTechnologyProvideimmersive,hands-onlearningexperiencesinareal-worldenvironment–soyoucanmeasureand......
  • python apscheduler定时任务处理
    ApschedulerApscheduler是一个基于Quartz的python定时任务框架,提供了基于日期、固定时间间隔以及corntab类型的任务,并且可持久化任务。安装apscheduler依赖库pipinstallapschedulerAPScheduler组件:schedulers-调度器triggers-触发器jobstores-作业存储器exec......
  • CF 2001 E2 solution (967 Div.2)
    CF2001E2由于对称,所以设\(heap[u]\)为两次确定堆,且第一次弹出的是\(u\),\(heap[u,v]\)是第一次\(u\),第二次\(v\)则答案就是\(\sumheap[u]=2^{n-1}·heap[x]\)其中\(x\)任意。不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点,根据对称性......
  • centos 7 部署k8s
    一、环境准备集群角色主机名操作系统IP地址内核Masterk8s-masterCentOSLinuxrelease7.9.2009(Core)172.16.99.713.10.0-957.el7.x86_64Nodek8s-node01CentOSLinuxrelease7.9.2009(Core)172.16.99.723.10.0-957.el7.x86_64Nodek8s-node02Cent......
  • COMP 627 COMP 627 Neural Networks and Applications
    1COMP627–Assignment1Note:RefertoEq.2.11inthetextbookforweightupdate.Bothweights,w1andb,needtobeadjusted.AccordingtoEq.2.11,forinputx1,errorE=t-yandlearningrateβ:w1_new=w1_old+βEx1;bnew=bold+βECOMP627Neural......
  • C# Delegate 操作符深入浅出
    目录Delegate基础Delegate操作符Lambda表达式总结在C#中,delegate是一个非常重要的概念,它提供了一种将方法作为参数传递的方式。delegate操作符,即=>,是C#6.0引入的一种新语法,用于简化delegate的声明和使用。在这篇博客中,我们将深入探讨delegate操作符的原理和用法。......
  • 【Advanced Renamer】,批量修改文件名,啥都能改的神器!
    最近有朋友问有没有可能批量修改文件、文件夹名字的工具?好多人都吐槽,下载资源的时候都有一堆引流的后缀,想直接下载到本地后批量修改。这里从解决实际问题的角度上,给你大家带来一款知名最高的“批量修改文件名”的小工具:【AdvancedRenamer】资源在文末。在Windows种,通过快......
  • 微信麦克风与CallKit不成功的解决方法
    分析原因iOS15.5+以上设备使用的巨魔2,覆盖安装商店版微信后,由于权限问题导致;解决方法①权限修改方法打开【TorllStore巨魔商店】找到安装好的微信点一下,底部提示框弹出,选择【Switchto“User”Registration】,提示框弹出,选择【Switchto“User”】,这时候你就是User权限,麦克风......