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 消息处理,消息循环从消息队列中取 ...
随机推荐
- Struts2和Spring的区别
1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...
- Codeforces 232 B Table 题解 [ 蓝 ] [ 分组背包 ] [ 组合数学 ] [ 循环节 ]
Codeforces 232B Table. 蒟蒻模拟赛上场切的一道蓝,非常难以置信我竟然能做蓝题. 这题的数据范围初看还是比较坑的,\(10^{18}\) 的值域很容易让人往矩阵加速那方面想.实际上 ...
- element-ui中el-table多层数组渲染问题
tableData: [ { name: '国家出资人', list: [ { name: '2011', value: '0' }, { name: '2012', value: '0' }, { ...
- 【IDEA】IDEA上如何解决代码冲突
首先,坐好准备工作,在feature-resolve-conflict分支上作如下改动: 在master分支作如下改动: 假如现在我们需要将master分支合并到feature-resolve-con ...
- 解决2023新版Edge浏览器页面加载不出来问题
如果你遇到2023新版Edge浏览器页面无法加载的问题,可以尝试以下几种解决方法: 检查网络连接:确保你的网络连接正常,可以尝试打开其他网页或使用其他应用程序进行网络测试. 清除浏览器缓存:打开Edg ...
- mybatis - [08] mybatis-config.xml 详解
mybatis-config.xml中的标签需要按照一定顺序配置,否则会有以下提示. configuration(配置) properties(属性) settings(设置) typeAliases ...
- 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结
前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...
- 【渗透测试】Vulnhub GROTESQUE 1.0.1
渗透环境 攻击机: IP: 192.168.10.18(Kali) 靶机: IP:192.168.10.9 靶机下载地址:https://www.vulnhub.com/entry/gro ...
- thinkphp或laravel连接sql server 2014数据库
问题描述:平时使用最多为mysql数据库,目前有项目数据库为sql server 2014,列出连接全过程 首先下载安装SQLserver的odbc开放数据库链连接,下载地址:https://lear ...
- FastAPI依赖注入:参数共享与逻辑复用
扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长 第一章:依赖注入核心原理 1.1 依赖树构建机制 from fastapi import Depends def auth_service ...