C# 在异步函数内调用非异步方法
请帮助我理解下面代码段的异步/等待操作C# 在异步函数内调用非异步方法,c#,async-await,C#,Async Await,请帮助我理解下面代码段的异步/等待操作 1. public async Task OuterMethodAsync(MyObject obj1) 2. { 3. var dbResult = await repo.SomeDB_GetCallAsync(obj1.id); 4. var httpResult = await Function1ContainingHTTPCallAsync(dbResult); 5. dbResult.param1 = obj1.p
1. public async Task OuterMethodAsync(MyObject obj1)
2. {
3. var dbResult = await repo.SomeDB_GetCallAsync(obj1.id);
4. var httpResult = await Function1ContainingHTTPCallAsync(dbResult);
5. dbResult.param1 = obj1.param1;
6. var isSuccess = Function2(httpResult, dbResult);
7. await repo.SomeDB_UpdateAsync(dbResult);
8. if(isSuccess)
9. {
10. // Do some stuff
11. }
12. }
如果函数2的输入参数httpResult为null,则该函数应该返回false
根据包含TTPCallasync的函数1中的日志
await
用法,因此:第6行在应该执行之前未执行。您必须研究Function2
可以返回false
的场景,并可能使用调试器查看发生了什么。从这里我们可以看出,所示的代码很好
请注意,在调试环境中,在有意义地定义/分配issucess
之前,您可能会看到它的值-例如,如果您在OuterMethod
上设置断点。这并不意味着第6行已经执行;这只是意味着调试器可以看到幕后的情况。严格地说,第6行之前的值是未定义的,但实际上,由于C#编译器发出.locals init
(至少目前),它将是false
,因为false
是bool
的默认值
您可能还想检查
OuterMethod
是否会被单独调用两次。这不会编译,因为OuterMethod
没有返回类型。请显示您的真实代码。第6行的参数是第4行的结果,因此第6行不能在第4行之前执行。@someone OuterMethod返回void(Task)。此外,任何async
的内容都应以async
作为后缀。然而,撇开我的强迫症不谈<代码>等待实际上在等待,尽管其中一些代码可能会被推送到IO完成端口,但代码将按顺序运行。答案是,不,假设您等待所有异步调用,那么第6行将不会在第4行之前执行。您的假设(只有在第6行在第4行之前执行时才会发生)是否有缺陷?如果这个假设是正确的,Function2
将毫无用处,除非您依赖它的一些副作用。不管怎样,是什么阻止了你调试这个程序,阻止了你一步一步地去看会发生什么呢?谢谢你的详细回复。我还补充了几点:Function2应该返回false,前提是它的输入参数httpResult为null。根据Function1ContainingHTTPCallAsync中的日志,它已成功执行,并返回了一个非空字符串的有效响应httpResult。但是,根据Function2中的日志,它已将输入参数httpResult接收为null,因此,回答false@CodingEveryDay然后,您需要查看function1containingTTPCallasync
以了解在什么情况下它可以返回null
-可能存在恶意catch(Exception ex){Log(ex);return null;}
-因为编写的代码:很好。或者,我重复我自己的话:使用调试器,看看值是什么这在生产设置中发生了,我在那里看到了日志,当我在本地使用调试点尝试它时,它是不同的。函数2实际上返回一个true@CodingEveryDay然后需要改进日志记录;不管发生了什么:它不是特定于您所展示的代码的,所以您需要超越它that@CodingEveryDay要评论这一点,我需要足够的代码来重新编程;你有密码,我没有;你得调查一下