

【踩坑】.NET异步方法不标记async,Task<int> 返回值 return default问题 - 欲...
source link: https://www.cnblogs.com/xuyd/p/17352771.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【踩坑】.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 属性获取错误信息。
Recommend
-
49
慢慢的总是发现以前的学得时候有些老师讲的不对的地方! 所以还是尽量别把一些东西说的那么绝对,不然总是很容易误导别人,特别是一些你自己根本就没有试过的东西,然后又斩钉截铁的告诉别人,这样不行,肯定不行什
-
3
Return a Default Value with Promises Using catch By David Walsh on December 23, 2020 Last week I tweeted all of you looking for your best JavaScript
-
15
2020-12-27 / 语义分割
-
8
Golang中defer、return、返回值之间执行顺序的坑 henrylee2cn · 2015-09-13 16:00:00 · 14064 次点击 · 预计阅读时间 2 分钟 · 不到1分钟之前 开始浏览 ...
-
10
V2EX › 程序员 部分业务通过 MQ 异步处理,但接口返回后就立刻查询,这种情况怎么处理?
-
6
我的需求是创建一个新线程来执行一些操作,因为如果用同一个线程就会导致资源一直被占据,影响响应效率。异步的概念我的理解:异步即为在多辆车在多条路上行驶,同步即为多辆车在一条路上行驶。举个栗子:同...
-
6
<?xml encoding="utf-8" ??>Introduction When you deploy a Vultr virtual cloud server, it receives an IP address assignment automatically with DHCP. Usually, you do not need to change the network...
-
7
js foreach循环使用return跳出循环及返回值无效 for循环使用有效 一次项目中使用forEach进行遍历,达到某一条件,希望跳出循环,代码不继续执行。
-
6
1.全局变量法(慎用)(宏定义也可以实现) 使用全局变量的原因 由于全局变量的作用域是从变量定义处开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局...
-
9
Conversation Member This ensures...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK