首页 > 其他分享 >【踩坑】.NET异步方法不标记async,Task<int> 返回值 return default问题

【踩坑】.NET异步方法不标记async,Task<int> 返回值 return default问题

时间:2023-04-25 15:33:05浏览次数:31  
标签:异步 Task return default await async 方法

        在.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 属性获取错误信息。

标签:异步,Task,return,default,await,async,方法
From: https://www.cnblogs.com/xuyd/p/17352771.html

相关文章

  • @JvmDefault is only supported since JVM target 1.8. Recompile with '-jvm-target
    问题Logcat提示’@JvmDefault’isonlysupportedsinceJVMtarget1.8.Recompilewith'-jvm-target1.8’解决在gradle中插入以下代码android{//..其他代码...kotlinOptions{jvmTarget="1.8"}}问题Logcat提示:Usageof‘@JvmDefault......
  • 【c&c++】VScode报错error: ‘::main‘ must return ‘int‘ void main()
    在运行指针时终端出现error:‘::main’mustreturn‘int’voidmain()错误。源代码如下:#include<stdio.h>voidmain(){inta,*p,b,c,d,e;a=100;p=&a;/*(*&a)先进行&a运算,得a的地址,再进行*运算,即变量a的值*/b=*&a;printf("a=%d\n",a);......
  • grafana面板上出现“Only queries that return single…”异常
    问题现象:数据读取不上,如下图问题根因:启动停止了很多次postgresexport并且这个数据库环境进行恢复快照过,导致Prometheusserver中存在相同实例不同的数据,进而导致通过语法无法确定唯一的数据出现报错。解决方案:通过Prometheus的api对实例的数据进行清空,让export重新获取新的数......
  • c# 异步进阶———— 自定义 taskschedule[三]
    前言我们知道我们的taskasync和await是基于线程池进行调度的。但是async和await也就是使用了默认的task调度,让其在线程池中运行。但是线程池是榨干机器性能为本质的,但是有时候我们运行一些我们自己的需求,比如控制一下线程数(因为并不是线程数越高,就能有更高的性能),控制一......
  • FutureTask源码分析
    1、Callable与FutureTask介绍1.1、Callable创建线程有两种方式,一种是继承Thread类,一种是实现Runnable接口重写run方法。其实Thread也实现了Runable接口。在Runable接口中,仅有一个无参无返回结果的run方法。Runable接口详情:1@FunctionalInterface2publicinterfa......
  • break、continue、return的区别
    (1)break常在switchcase中使用,也可以在循环中使用。作用:当遇到break,则结束当前整个switchcase语句或者当前整个循环。执行外面语句。(2)continue:只能在循环中使用。作用是结束当前这一次循环,执行下一次循环。(3)return:在方法中使用,作用是结束当前方法,并把结果返回到方法的调用处。如......
  • spring 自动装配 default-autowire="byName/byType"[转]
    spring自动装配default-autowire="byName/byType"一、spring自动装配default-autowire="byName"byName,按变量名称,与id名称一样,若不一样,就报错。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.o......
  • php exit、return、break、continue之间的区别,详细介绍
    相信大家在php开发中有几个常用的停止程序和循环的关键字的误区( exit、return、break、continue)exit退出所有脚本,是个函数return语言结构的用法---作用:终止函数的执行和从函数中返回一个值break结束当前for,foreach,while,do..while或者switch结构的执行(break可以接受一......
  • Unable to tunnel through proxy. Proxy returns "HTTP/1.1 503 Service Unavailable
    背景:某日,一正常项目迁移到新的服务器新的服务器,需要使用代理来访问之前能直接访问的接口,加完代理之后,发现无法获取数据了报错:org.springframework.web.client.ResourceAccessException:I/OerroronGETrequestfor"https://xxxxxxxxxx/xxxx":Unabletotunne......
  • Vue Typescript 引入文件接口,就无法使用withDefaults
    就是代码写的不规范报错写法 import{Setting}from'@element-plus/icons-vue' import{defineProps,withDefaults}from'vue' import{PiProject}from'@/types/Project' interfaceProjectCardProps{ project:PiProject } constprops=de......