【踩坑】.NET异步方法不标记async,Task<int> 返回值 return default问题
在.NET中,返回类型为 Task<T> 的方法并不一定要标记为 async。这是因为 async 关键字只是用来告诉编译器该方法中包含异步操作,并且可以使用 await 和其他异步特性(如 Task.WhenAll)来等待异步操作完成。
如果一个方法中没有使用 await 或者其他异步特性,但是返回类型为 Task<T>,那么该方法仍然是异步方法。它返回的任务(Task<T>)表示一项异步操作,可以被等待。
例如,以下示例中的 DoSomethingAsync 方法返回一个 Task<int> 对象,但是没有使用 async 关键字:
public Task<int> DoSomethingAsync()
{
return Task.Run(() =>
{
// 在此方法中执行一些异步操作,例如读写文件、调用Web服务等。
// 这里使用 Task.Run 来模拟一些耗时的操作。
Thread.Sleep(TimeSpan.FromSeconds(1)); // 睡眠1秒钟
return 42; // 返回异步操作的结果
});
}

在上述示例中,DoSomethingAsync 方法使用 Task.Run 来开启一个新的线程执行异步操作,然后返回结果。虽然该方法没有标记为 async,但是它返回的 Task<int> 对象同样可以使用 await 关键字等待异步操作完成。例如:
int result = await DoSomethingAsync();

在调用 DoSomethingAsync 方法时,返回的 Task<int> 对象表示一项异步操作,可以使用 await 关键字等待操作完成。因此,即便方法没有标记为 async,它仍然属于异步方法。
坑点
public Task<int> DoSomethingAsync()
{
return default;
}

由于返回Task<int>的异步方法代码,可以通过客户代码await等待异步方法结果,可以直接拿到T的结果。而如果异步方法里直接return default相当于是返回了null而不是一个Task<int> 也就无法等待了。await null就会报错。IDE对于此类问题并没有给出友好的警告或者提示。
解决方案
将方法返回类型从 Task<int?> 改为 Task<Result<int>>,其中 Result<T> 是自定义的一个类,用于表示异步操作的执行结果。具体实现如下:
public Task<int> DoAsync()
{
return default;
}
public async Task<Result<int>> DoSomethingAsync()
{
string msg = string.Empty;
if (string.IsNullOrWhiteSpace(msg))
{
return Result<int>.Fail("错误提示.");
}
var count = await DoAsync();
return Result<int>.Success(count ?? 0);
}

调用该方法时,需要检查 Result 对象的 IsSuccess 属性,以判断该异步操作是否成功。如果成功,则可以使用 Value 属性获取查询结果。否则,可以使用 Message 属性获取错误信息。
【踩坑】.NET异步方法不标记async,Task<int> 返回值 return default问题的更多相关文章
- Task作为返回值以及Task<TResult>作为返回值
async await return Task https://stackoverflow.com/questions/25191512/async-await-return-task Can som ...
- 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。
一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...
- C#异步编程のTask模型返回值Task<TResult>应用
文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实awai ...
- 小程序踩坑之获取不到e.target.dataset的值
在页面与js传值中我们经常用到data-id="1"的方式,然后通过e.target.dataset.id取id的值今天在获取值时怎么也取不到,后来发现e对象有currentTar ...
- vue踩坑:vue+ element ui 表单验证有值但验证失败。
一.如图:有值但是验证失败 二. <el-form :model="form" :rules="rules"> <el-form-item l ...
- 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...
- Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- async task 异步消息
async 和 await 是用来定义的异步方法,async 关键字是上下文关键字,原因在于只有当它修饰方法.lambda 表达式或匿名方法时,它才是关键字. 在所有其他上下文中,都会将其解释为标 ...
- .Net 异步方法, await async 使用
最近朋友问起await 和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思, 异步 ...
随机推荐
- 搭建Angular基础项目学习
https://stackblitz.com/借助StackBlitz网站可快速开始搭建一个angular项目 一个angular的component包含三项东西 A component class ...
- 总项目的pom文件
注意修改子模块名称!!!!!!!!!!!!!!!!!!<?xml version="1.0" encoding="UTF-8"?> <proj ...
- baodoumi yml配置
上次因为自增,发现配置没生效, 修改后如下 # 配置mybatis-plus, 参考:com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropert ...
- 【OGF生成函数板子题】牛客编程巅峰赛S2第11场 C 挑选方案问题
upd 2022-01-26 我找到了个题集 牛客竞赛数学专题班生成函数I(线性递推关系.生成函数概念与公式推导.暴力计算) 目录 题目链接 题面 解题思路 AC代码 题目链接 https://ac. ...
- Django笔记二之连接数据库、执行migrate数据结构更改操作
本篇笔记目录索引如下: Django 连接mysql,执行数据库表结构迁移步骤介绍 操作数据库,对数据进行简单操作 接下来几篇笔记都会介绍和数据库相关,包括数据库的连接.操作(包括增删改查).对应的字 ...
- Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口
环境安装: (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4 上一篇相关随笔: Go语言:利用 TDD 测试驱动开发帮 ...
- Spring MVC 和 Struts 的区别是什么?
1. 拦截机制的不同 Struts2 是类级别的拦截,每次请求就会创建一个 Action,和 Spring 整合时 Struts2 的 ActionBean 注入作用域是原型模式 prototype, ...
- 从零开始学Java系列之Java是什么?它到底是个啥?
全文大约[5000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!文章带有丰富案例及配图,只为让你更好的理解和运用文中的技术概念,给你带来具有足够的思想启迪...... ----------- ...
- Spring事务的底层原理
1. 划分处理单元--IOC 由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring 中的IOC划分了事务处理单元.并且将对事务的各种配置放到了ioc容器中(设置事务 ...
- flutter widget---->Spacer
如果你想灵活控制Flex容器(Row, Column)中子组件中的间隔,可以考虑使用Spacer.下面以Row为例子,来为它的子组件添加间距. use Spacer import 'package:f ...