在.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问题的更多相关文章

  1. Task作为返回值以及Task<TResult>作为返回值

    async await return Task https://stackoverflow.com/questions/25191512/async-await-return-task Can som ...

  2. 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。

    一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...

  3. C#异步编程のTask模型返回值Task<TResult>应用

    文中所有Task<TResult>的返回值都是直接用task.result获取,这样如果后台任务没有执行完毕的话,主线程会等待其执行完毕,这样的话就和同步一样了(看上去一样,但其实awai ...

  4. 小程序踩坑之获取不到e.target.dataset的值

    在页面与js传值中我们经常用到data-id="1"的方式,然后通过e.target.dataset.id取id的值今天在获取值时怎么也取不到,后来发现e对象有currentTar ...

  5. vue踩坑:vue+ element ui 表单验证有值但验证失败。

    一.如图:有值但是验证失败 二. <el-form :model="form" :rules="rules"> <el-form-item l ...

  6. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

  7. Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...

  8. 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 ...

  9. async task 异步消息

     async 和 await 是用来定义的异步方法,async  关键字是上下文关键字,原因在于只有当它修饰方法.lambda 表达式或匿名方法时,它才是关键字. 在所有其他上下文中,都会将其解释为标 ...

  10. .Net 异步方法, await async 使用

    最近朋友问起await  和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思,  异步 ...

随机推荐

  1. 搭建Angular基础项目学习

    https://stackblitz.com/借助StackBlitz网站可快速开始搭建一个angular项目 一个angular的component包含三项东西 A component class  ...

  2. 总项目的pom文件

    注意修改子模块名称!!!!!!!!!!!!!!!!!!<?xml version="1.0" encoding="UTF-8"?> <proj ...

  3. baodoumi yml配置

    上次因为自增,发现配置没生效, 修改后如下 # 配置mybatis-plus, 参考:com.baomidou.mybatisplus.autoconfigure.MybatisPlusPropert ...

  4. 【OGF生成函数板子题】牛客编程巅峰赛S2第11场 C 挑选方案问题

    upd 2022-01-26 我找到了个题集 牛客竞赛数学专题班生成函数I(线性递推关系.生成函数概念与公式推导.暴力计算) 目录 题目链接 题面 解题思路 AC代码 题目链接 https://ac. ...

  5. Django笔记二之连接数据库、执行migrate数据结构更改操作

    本篇笔记目录索引如下: Django 连接mysql,执行数据库表结构迁移步骤介绍 操作数据库,对数据进行简单操作 接下来几篇笔记都会介绍和数据库相关,包括数据库的连接.操作(包括增删改查).对应的字 ...

  6. Go语言:利用 TDD 驱动开发测试 学习结构体、方法和接口

    环境安装: (新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4 上一篇相关随笔: Go语言:利用 TDD 测试驱动开发帮 ...

  7. Spring MVC 和 Struts 的区别是什么?

    1. 拦截机制的不同 Struts2 是类级别的拦截,每次请求就会创建一个 Action,和 Spring 整合时 Struts2 的 ActionBean 注入作用域是原型模式 prototype, ...

  8. 从零开始学Java系列之Java是什么?它到底是个啥?

    全文大约[5000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!文章带有丰富案例及配图,只为让你更好的理解和运用文中的技术概念,给你带来具有足够的思想启迪...... ----------- ...

  9. Spring事务的底层原理

    1. 划分处理单元--IOC 由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring 中的IOC划分了事务处理单元.并且将对事务的各种配置放到了ioc容器中(设置事务 ...

  10. flutter widget---->Spacer

    如果你想灵活控制Flex容器(Row, Column)中子组件中的间隔,可以考虑使用Spacer.下面以Row为例子,来为它的子组件添加间距. use Spacer import 'package:f ...