C# 每个';等待&x27;操作员在状态机中的结果? 请考虑以下代码: 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; } 公共异步任务GetString() { //这里有一些代码。。。 var data=等待A(); //更多的代码。。。 返回数据; } 专用异步任务A() { //这里有一些代码。。 var data=wait B(); //正在处理数据。。。 返回数据; } 专用异步任务B() { //这里有一些代码。。 var data=wait C(); //正在处理数据。。。 返回数据; } 专用异步任务C() { //这里有一些代码。。 var data=await FetchFromDB(); //正在处理数据。。。 返回数据; } 私有异步任务FetchFromDB() { 返回等待一些HTTP请求; }
这段代码演示了一个最基本的功能——嵌套异步方法。 每个方法都会被转换成状态机吗?或者编译器是否足够复杂以生成更高效的结构? 在我的一些项目中,UI/WebAPI和I/O调用之间有大约20种方法——这是否会影响异步等待开销(如状态机)和非阻塞线程好处之间的权衡?C# 每个';等待&x27;操作员在状态机中的结果? 请考虑以下代码: 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; } 公共异步任务GetString() { //这里有一些代码。。。 var data=等待A(); //更多的代码。。。 返回数据; } 专用异步任务A() { //这里有一些代码。。 var data=wait B(); //正在处理数据。。。 返回数据; } 专用异步任务B() { //这里有一些代码。。 var data=wait C(); //正在处理数据。。。 返回数据; } 专用异步任务C() { //这里有一些代码。。 var data=await FetchFromDB(); //正在处理数据。。。 返回数据; } 私有异步任务FetchFromDB() { 返回等待一些HTTP请求; },c#,asp.net,async-await,clr,C#,Asp.net,Async Await,Clr,这段代码演示了一个最基本的功能——嵌套异步方法。 每个方法都会被转换成状态机吗?或者编译器是否足够复杂以生成更高效的结构? 在我的一些项目中,UI/WebAPI和I/O调用之间有大约20种方法——这是否会影响异步等待开销(如状态机)和非阻塞线程好处之间的权衡? 我的意思是,例如,如果4个状态机(4个嵌套异步方法)的开销等于50毫秒的阻塞I/O(折衷),那么20个状态机是否等于更长的I/O延迟(250毫秒) 等待在这种情况下并不重要每个async方法将生成一个状态机(即使它根本没有waits) 你
我的意思是,例如,如果4个状态机(4个嵌套异步方法)的开销等于50毫秒的阻塞I/O(折衷),那么20个状态机是否等于更长的I/O延迟(250毫秒)
等待
在这种情况下并不重要每个async
方法将生成一个状态机(即使它根本没有wait
s)
你可以看到这一点
如果您遇到不需要状态机的情况,那么方法实际上不需要是async
,例如:
private async Task<string> D()
{
var data = await FetchFromDB();
return data;
}
但除此之外,您实际上需要状态机,没有它,async
方法无法运行
您应该注意,与使用
asyncwait
节省的资源相比,开销非常小,通常可以忽略不计。如果您意识到情况并非如此(通过测试),您可能应该使该操作同步。每个方法都将有一个状态机,是的
请记住,状态机的“开销”主要是一个对象的分配(这和一些goto
s,它们将非常快),因此您执行的任何类型的“优化”都与不创建一次类实例相同
至于它的成本是大于还是小于同步工作,这是您需要在给定的应用程序和硬件细节上进行性能基准测试才能确定的
每个方法都会被转换成状态机吗?或者是
编译器是否足够复杂以生成更高效的结构
不,编译器将为每个调用生成一个状态机。编译器不会检查方法的语义调用链。它将仅基于方法生成状态机
在查看编译后的代码时,您可以清楚地看到:
这是否会影响异步等待开销(例如
作为状态机)和非阻塞线程的好处
你必须测试你的代码才能说出来。一般来说,异步IO在需要吞吐量时是很好的。如果您的异步方法将被多个调用者同时命中,您将能够看到好处。否则,您可能看不到性能提高的任何效果。再次,对代码进行基准测试。他没有
async
方法,没有wait
;这不是问题。他基本上是在问这个方法是否会内联,以便只需要创建一个状态机,而不是每个方法都创建一个状态机。@Servy没有说OP会这样做。谢谢,我会把这标记为一个答案,因为你是第一个回答我所有问题的人,尽管@Yuval Itzhakov和i3arnon也提供了很好的答案。谢谢大家。
private Task<string> D()
{
return FetchFromDB();
}