【发布时间】:2020-12-26 12:15:11
【问题描述】:
请帮我理解下面这段代码的异步/等待操作。
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. }
Function2 应该返回 false,如果它的输入参数 httpResult 为空。
基于Function1ContainingHTTPCallAsync中的日志,
- 已经成功执行http调用,
- 返回了一个有效的响应httpResult,它是一个非空字符串
但是,根据Function2中的日志,
- 接收到输入参数httpResult为空
- 返回错误
这里,
- Function2 不是异步的
- Function1ContainingHTTPCallAsync 是 异步
- SomeDB_GetCallAsync 是 异步
- SomeDB_UpdateAsync 是 异步
- OuterMethodAsync 是 异步
我在这里看到的问题是 isSuccess 被设置为 false。另外,请注意,OuterMethod 有可能被多次调用(这是框架中针对失败的 HTTP 调用的重试机制)。考虑到 OuterMethod 本身就是作为 HTTP 调用调用的 API,是否会导致此问题?
【问题讨论】:
-
这不会编译,因为
OuterMethod没有返回类型。请出示您的真实代码。 -
第6行的一个参数是第4行的结果,所以第6行不能在第4行之前执行。
-
@SomeBody OuterMethod 返回 void(任务)
-
此外,
async的任何内容都应以Async为后缀。但是我的强迫症放在一边。await实际上正在等待,尽管其中一些代码可能会被推送到 IO 完成端口,但代码将按顺序运行。答案是,不,假设你await你所有的 async 调用,第 6 行将不会在第 4 行之前执行 -
您的假设是否可能存在缺陷(仅当第 6 行在第 4 行之前执行时才会发生)?如果这个假设是正确的,
Function2将毫无用处,除非你依赖它的一些副作用。无论如何,是什么阻止你调试它并逐步查看会发生什么?
标签: c# async-await