Result、ConfigAwait、ValueTask
Result、ConfigAwait、ValueTask
参照:
C# Async/Await: ConfigAwait, ValueTask是个啥?对提高性能有用么?_哔哩哔哩_bilibili
理解ValueTask - 知乎 (zhihu.com)
Demo:https://files.cnblogs.com/files/summerZoo/AsyncAwaitAdvance.zip?t=1647483629
- Result
定义:
1、访问属性的 get 访问器会使当前线程等待(阻塞当前线程),直到异步操作完成;
2、效果像调用 Wait一样当前线程等待异步线程执行完,可用GetAwaiter().GetResult()替代
3、操作结果可用后,将存储该结果,在后续调用 属性时立即 Result 返回。若发生没有返回值的异常采用 AggregateException 捕获。
public TResult Result { get; }
用处:可用于在同步方法里用同步的方式调用异步方法
但是对于程序性能的考虑尽量不要采用这种方式,在winform里用Result会卡死调用的UI线程,可能还会因为在winform默认ConfigAwait为true的原因形成死锁
尽量采用异步async/await的方式去提高程序的性能。
例子:
class Program
{
static void Main(string[] args)
{
AsyncNoReturn().Wait();
int s = AsyncMethod().GetAwaiter().GetResult();
int m = AsyncMethod().Result;
}
public static async Task<int> AsyncMethod()
{
await Task.Delay(500);
return 22;
}
public static async Task AsyncNoReturn()
{
await Task.Delay(500);
}
}
- ConfigAwait
定义:配置用于等待此 Task的 awaiter
如下图若配置flag = true,则RunSomethingAsync在执行完毕后,返回原来线程ID为1的线程继续执行After Await的代码部分;
若配置flag = false,则RunSomethingAsync在执行完毕后,从线程池随机返回一个空闲的线程执行After Await的代码部分;
public async Task RunTask()
{
// Before Await;线程ID:1
await RunSomethingAsync().ConfigAwait(flag);
// After Await;
}
应用:
在Winform、WPF里,基本上ConfigAwait默认设置为true,因为在程序里有大量需要UI线程才能执行的操作
,After Await里有相关UI的操作,ConfigAwait配置成false,在完成RunSomethingAsync()后,随机从线程池拿一个空闲线程来继续往下执行After Await,若这个线程不是原有的UI线程则会出现异常。
除去上述情况下,我们把ConfigAwait设置成false,不要求在原来线程上继续执行可提高性能。
- ValueTask
ValueTask的数据结构比Task的数据结构小,在合适的场景下可使用替代Task,降低内存分配开销。
从本质上来讲ValueTask是一个结构体,Task是一个类。
在返回信息比较少的场景,比如Task、Task场景可以使用ValueTask、ValueTask来代替
适合场景:
1、运行吞吐量非常高的服务时,我们仍然关心怎么尽可能多地避免内存分配
使用条件:
- 不需要多次
await task
- 在非并发
await
场景(比如和WhenAny、WhenAll、ContinueWhenAll等组合器一起使用处理并发的场景) - 在Async方法被异步调用时,比如AsyncMethod().GetAwaiter().GetResult()、AsyncMethod().Result就不适合
Result、ConfigAwait、ValueTask的更多相关文章
- Android调用微信登陆、分享、支付
前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也 ...
- android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测
目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- Vue.js——使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
概述 上一篇我们介绍了如何使用vue resource处理HTTP请求,结合服务端的REST API,就能够很容易地构建一个增删查改应用.这个应用始终遗留了一个问题,Web App在访问REST AP ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 深入理解jQuery、Angular、node中的Promise
最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- Android消息处理机制(Handler、Looper、MessageQueue与Message)
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...
随机推荐
- IDEA Spring Boot项目,排查解决maven包冲突
一.Idea安装插件 下载方式1:插件名称:maven helper 打开Idea设置,搜索安装该插件 下载方式2:https://plugins.jetbrains.com/plugin/7179- ...
- FLink怎么做压力测试和监控?
我们一般碰到的压力来自以下几个方面: 一,产生数据流的速度如果过快,而下游的算子消费不过来的话,会产生背压问题.背压的监控可以使用Flink Web UI(localhost:8081)来可视化监控, ...
- centos 8 mysql 更改数据存储位置
登录mysql后,先切换到myql数据库下通过show global variables like '%datadir%'; 可以查看数据默认的存储路径(一般在 /var/lib/mysql) 新建数 ...
- 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
大家好,我是编程乐趣. DeepSeek大火,网络上也看到很多人分享本地部署心得.但想要更细了解,还是要自己本地部署一次. 我这次部署目标,就是在局域网服务器部署,并让局域网其他电脑可以直接访问. 选 ...
- PIP 换源:提升 Python 包安装速度的秘诀
一.引言 在使用 Python 进行开发时,我们经常需要通过 pip 命令安装各种库和依赖.然而,默认的源可能会因为网络原因导致下载速度缓慢,影响开发效率.这时候,换源就成为了一个非常实用的技巧. 二 ...
- docker - [03] docker原理
题记 一.docker是怎么工作的 docker是一个CS(Client - Server)结构的系统,docker的守护进程运行在主机上,通过Socket从客户端访问. docker Server接 ...
- day4-进制与位运算
进制 对于整数有4种表现方式 二进制,满二进一 十进制,满10进1 八进制,满8进1,数字0开头 十六进制,满16进1,以0x或0X开头 进制转换 二进制转十进制 规则:从最低位开始(右边),将每位数 ...
- python实现批量自动访问站点URL并获取内容,自动模拟打开电脑端及移动端URL访问站点,打开URL页面获取页面内容
问题描述:假设目前有多个网站URL,需要检查各站点keyword,description是否正常设置,如果人工逐个打开URL访问比较耗时,故采用python模拟电脑端和移动端自动打开网站URL访问,并 ...
- web站点常见漏洞及解决方法
1.PHP Web表单哈希冲突拒绝服务漏洞 漏洞分析:PHP 5.3.9之前版本在计算表单参数哈希值的实现上存在拒绝服务漏洞,该漏洞源于未提前限制哈希冲突.攻击者可利用该漏洞通过发送小量的特制webf ...
- php如何处理表单和数据库字段不匹配
// 假设从表单接收到的数据 $formData = [ 'first_name' => $_POST['first_name'], 'last_name' => $_POST['last ...