gpt4 book ai didi

c# - 每个 'await' 运算符都会产生一个状态机吗?

转载 作者:太空狗 更新时间:2023-10-29 22:08:03 54 4
gpt4 key购买 nike

请考虑以下代码:

public async Task<string> GetString()
{
//Some code here...
var data = await A();
//Some more code...
return data;
}
private async Task<string> A()
{
//Some code here..
var data = await B();
//manipulating data...
return data;
}
private async Task<string> B()
{
//Some code here..
var data = await C();
//manipulating data...
return data;
}
private async Task<string> C()
{
//Some code here..
var data = await FetchFromDB();
//manipulating data...
return data;
}
private async Task<string> FetchFromDB()
{
return await SOME_HTTP_REQUEST;
}

这段代码演示了一个最基本的功能——嵌套异步方法。每种方法都会转化为状态机吗?或者编译器是否足够复杂以生成更高效的结构?在我的一些项目中,UI/WebAPI 和 I/O 调用之间有大约 20 种方法——这会影响异步等待开销(例如状态机)和非阻塞线程优势之间的权衡吗?我的意思是,例如,如果 4 个状态机(4 个嵌套异步方法)的开销等于 50 毫秒的阻塞 I/O(就权衡而言),那么 20 个状态机是否等于更长的 I/O 延迟( 250 毫秒)?

最佳答案

await 在这种情况下无关紧要。 每个 async 方法都会生成一个状态机(即使它根本没有 await)。

你可以用 this TryRoslyn example 看到.

如果您遇到不需要状态机的情况,并且该方法实际上不需要像下面这样的async:

private async Task<string> D()
{
var data = await FetchFromDB();
return data;
}

可以去掉async关键字和它自带的状态机:

private Task<string> D()
{
return FetchFromDB();
}

但除此之外,您实际上需要状态机,并且 async 方法没有它就无法运行。

您应该注意到,开销非常小,与使用 async-await 节省的资源相比通常可以忽略不计。如果您意识到情况并非如此(通过测试),您可能应该使该操作同步。

关于c# - 每个 'await' 运算符都会产生一个状态机吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944276/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com