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 消息处理,消息循环从消息队列中取 ...
随机推荐
- Xshell不可以删除,退格^H
文件→属性→终端→键盘,把delete和backspace序列改为 ASCII 127即可.
- Flink同步mysql写入Iceberg异常,一秒写入一次
1.现象 在Iceberg数据湖治理过程中发现,同步任务运行7天没有写入数据,运行7天后突然大批量产生Commit,一秒产生一个Commit. 2.问题 Flink写入checkpoint时会在che ...
- Python if分支
分支语句: 1.单分支语句 1 if 条件表达式: 2 print("如果成立怎么养怎么样") 例:让用户输入年龄,如果大于18就可以去网吧偷耳机age = int(input(& ...
- 天线的OTA测试
有源测试 (即OTA测试) 把使用综测仪的测试叫做有源测试(Active).使用有源测试的测试速度比较无源相对要慢,但是因为手机是一个复杂材料体,往往无源测试对发射性能的模拟是可信的,但是对于接收性能 ...
- 【COM3D2Mod 制作教程(2)】Mod 底层原理
[COM3D2Mod 制作教程(2)]Mod 底层原理 Mod 是什么? Mod 一词想必你已经听过很多次了,因为很多游戏都可以装 Mod,而 Mod 可以为游戏增添一些额外的乐趣.但在 COM3D2 ...
- Web前端入门第3问:前端需要学习哪些技术?
Web前端开发技术学习路径 基础知识 必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了. 进阶知识 必须会一门主流的前端框架,比如:Rea ...
- coco数据集详解
什么是COCO数据集? MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageN ...
- zookeeper windows 安装
下载 zookeeper 下载地址为: https://zookeeper.apache.org/releases.html. 选择一个地址点击版本下载: 配置 下载后解压到指定磁盘的 zookeep ...
- 抓包分析:wireshark抓不到TLS1.3数据包中证书的解决方案
近日工作中遇到需要分析使用TLS1.3协议进行通信的数据包的情况,但使用wireshark进行分析发现不能抓到服务端证书,感到诧异遂设法解决 这篇博客给出解决方案,和简单的原理分析 解决方案: 第一步 ...
- 使用df命令
1.使用df命令,查看整体的磁盘使用情况 df命令是用来查看硬盘的挂载点,以及对应的硬盘容量信息.包括硬盘的总大小,已经使用的大小,剩余大小.以及使用的空间占有的百分比等. 最常用的命令格式就是: 1 ...