首页 > 编程语言 >C#异步方法async/await的三种返回类型

C#异步方法async/await的三种返回类型

时间:2023-05-16 12:34:02浏览次数:42  
标签:返回 异步 Task C# ValueTask await 使用 操作 async

有群友问C#异步方法async返回值Task和void的区别?看似简单,但不容易把它们用好。在C#中的异步编程已经成为现代编程的标配,异步方法(async/await)是实现异步编程的一种常用方式。在异步方法中,可以使用 Task 或 void 作为返回类型,还可以使用ValueTask返回类型。本文将介绍异步方法中3个返回类型 Task 、void和ValueTask。

一、 void类型

使用 void 作为异步方法的返回类型,表示该方法将执行异步操作,但不会返回任何结果。由于异步方法无法返回结果,因此调用该方法的代码无法使用 await 关键字来异步等待其结果。相反,可以使用事件或回调函数来处理异步操作的结果。但是,使用回调函数或事件来处理异步操作的结果比使用 await 关键字更加繁琐和难以维护。示例如下:

public async void DoSomethingAsync()
{
    // 异步操作
    await LongRunningOperationAsync();

    // 操作完成后触发事件
    OnOperationCompleted();
}

使用场景:

从上看是比较难用的,那么我们看看它的具体使用场景有哪些?一般在 Windows Forms 应用程序中,使用异步方法来处理 UI 事件的方式就是使用 void 作为返回类型。在异步方法中,可以执行一些 IO 操作、计算等操作,并在操作完成后通过委托或事件通知 UI 线程更新 UI。普通方法不建议使用,可以直接返回Task。

二、Task类型

Task 比较常用并且推荐使用的返回类型。使用 Task 作为异步方法的返回类型,可以让异步方法返回一个异步操作的结果。调用该方法的代码可以使用 await 关键字来异步等待该结果。当异步操作完成时,Task 将包含异步操作的结果。这种方式可以更好地支持异步编程和错误处理。案例如下:

//返回一个 Task<int> 对象,表示该方法将返回一个异步操作的结果.
public async Task<int> CalculateAsync()
{
    // 异步计算操作
    int result = await LongRunningOperationAsync();

    // 返回异步操作的结果
    return result;
}

Task 的使用场景

当异步方法需要返回一个异步操作的结果时,应该使用 Task 作为返回类型。在这种情况下,Task 可以让调用代码使用 await 关键字来等待异步操作的结果。Task 还提供了一些有用的方法和属性,如异常处理、取消操作等,可以更好地支持异步编程和错误处理。

例如,在 Web API 中,使用异步方法来处理 HTTP 请求的方式就是使用 Task 作为返回类型。在异步方法中,可以执行一些 IO 操作、数据库查询、计算等操作,并将结果封装到 Task 对象中返回。客户端可以使用 await 关键字等待异步操作完成,并获取操作的结果。

、ValueTask类型

ValueTask 是 .NET Core 2.1 引入的一种新的异步编程模式,用于优化内存分配和性能,尤其是在大量的异步操作中。ValueTask 作为一种新的异步编程模式,可以在某些情况下更加高效地处理异步操作。ValueTask 本身是一个结构体,它可以用于打包异步操作的结果,并且可以避免 Task 对象的不必要的分配。在使用 ValueTask 时,如果异步操作已经完成,则可以直接从 ValueTask 中获取结果,而无需等待 Task 对象的状态。如果异步操作尚未完成,则可以通过异步等待来等待操作完成。

//使用 ValueTask<int> 作为返回类型,可以避免创建 Task 对象和其他不必要的开销。
public async ValueTask<int> ComputeAsync(int x, int y)
{
    // 模拟一些耗时的计算操作
    await Task.Delay(1000);
    // 计算结果
    var result = x + y;
    // 返回结果
    return result;
}
//欢迎关注公众号:DOTNET开发跳槽,领取海量面试题。加微信号xbhpnet入群

使用场景

1、大量的异步操作

在高并发的情况下,使用 Task 对象可能会导致大量的内存分配和垃圾回收。使用 ValueTask 可以避免不必要的内存分配,从而提高性能和效率。

2、频繁的异步操作

在一些需要频繁执行的异步操作中,使用 Task 可能会产生过多的垃圾,而使用 ValueTask 可以更好地管理内存并提高性能。

3、长时间运行的异步操作

在一些长时间运行的异步操作中,使用 Task 可能会导致大量的内存分配和垃圾回收,而使用 ValueTask 可以更好地管理内存并提高性能。

结语

Task 、void和ValueTask 作为异步方法的返回类型,应该根据实际需求和编程方式来选择合适的类型,大家可以参考文中他们各自的使用场景。希望本文对你有所收获,你对Task 、void和ValueTask 三个返回类型有什么看法欢迎留言讨论。

参考:微软官方文档,chatgpt

来源公众号:DotNet开发跳槽

标签:返回,异步,Task,C#,ValueTask,await,使用,操作,async
From: https://www.cnblogs.com/xbhp/p/17404580.html

相关文章

  • 图解LeetCode——234. 回文链表
    一、题目给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。二、示例2.1>示例1:【输入】head=[1,2,2,1]【输出】true2.2>示例2:【输入】head=[1,2]【输出】false提示:链表中节点数目在范围[1,10^5]内0<=Node.v......
  • tomcat startup.bat配置JAVA_HOME
    使用zip的tomcat包,不改变系统的环境变量JAVA_HOME的情况下启动:我用的是tomcat6.0.16在tomcat内部修改JAVA_HOME:bin/catalina.bat中头部添加setJAVA_HOME="D:\jdk\jdk1.6"估计在bin/startup.bat添加也可以,没有测试。要保留startup.bat运行的输出日志():修改startup.ba......
  • Actor Prioritized Experience Replay
    论文宗旨:由于PER是以TD-error成正比的非均匀概率进行抽样的,但是在AC算法中即连续动作空间中,会表现出低效果。分析结果是:Actor不能有效的从highTD-error的transition中学习,Q网络下近似的policygradient会偏离最优Q下的真实梯度。提出修正方法:Actor从lowTD-error的transiti......
  • 双DSP6657+FPGA K7架构电路方案 双DSP型号:TMS320C6657,FPGA型号:XC7K325T-2FFG900,AD
    双DSP6657+FPGAK7架构电路方案双DSP型号:TMS320C6657,FPGA型号:XC7K325T-2FFG900,ADC型号:AD9467,DAC型号:AD9779等电路原理图+PCB设计,已生产验证过。ID:711000633647000937......
  • STM32F0系列FOC 源代码, 有单电阻采样和三电阻采样两种代码。 都是ST
    STM32F0系列FOC源代码,有单电阻采样和三电阻采样两种代码。都是ST很经典算法,代码学习,无感算法开源,代码不是库。学习代码规范和无感FOC算法。ID:74100634294302968......
  • Allegro PCB封装库(分类、命名很规范,已验证) 该PCB库特点一:类型
    AllegroPCB封装库(分类、命名很规范,已验证)该PCB库特点一:类型齐全,包含有阻容感分立元器件;SOIC(SO,SOP,SSOP,TSOP,TSSOP);QFN;QFP(PQFP,SQFP,CQFP);PLCC;BGA及常用连接器等PCB封装,共400多个的库文件。该PCB库特点二:库文件命名规范,例如BGA类型的PCB封装命名为:BGA+引脚数+PIN间距+主体......
  • crontab工具使用介绍
    在Linux系统中,我们可以通过crontab工具来执行定时任务。它可以帮助我们在特定的时间间隔内执行特定的命令或程序,这对于自动化运维、备份或数据处理等任务非常有帮助。使用crontab工具需要了解以下几个部分:1.crontab格式crontab格式由6个字段组成,它们分别是:分钟(0-59)小......
  • Vue、React和小程序都是流行的前端开发框架/平台
    Vue、React和小程序都是流行的前端开发框架/平台,它们各有优缺点。Vue的优点:简单易学:Vue的语法简单明了,易于理解和学习。渐进式框架:Vue可以逐渐地集成到现有项目中,也可以作为完整的单页应用程序开发。响应式设计:Vue的响应式设计使得数据变化后UI自动更新,方便快捷。高......
  • 哪里可以获取bricscad23中文破解版资源,最新bricscad中文版下载
    哪里可以获取bricscad23中文破解版资源呢,小编为大家带来了最新bricscad中文版下载安装包。BricsCAD23是一款功能强大、易于使用的CAD软件,可以帮助用户进行2D和3D设计和制造,并提供多种高级功能和集成方式,是工程师和制造商的重要工具。bricscad中文版下载Bricscad的提供所有熟悉......
  • Unable to bind to http://localhost:xxxx on the IPv4 loopback interface: '以一种
    这个错误大概率是端口冲突, 这里不再赘述。具体(参考https://www.cnblogs.com/zhengdongdong/p/12001152.html)我这边的原因是运行端口在被排除端口范围中(参考https://gsw945.com/index.php/archives/33/)cmd运行 netshinterfaceipv4showexcludedportrangeprotocol=tcp......