【发布时间】:2020-08-02 13:51:59
【问题描述】:
我熟悉 async/await,它使用 async 函数在 await 上将线程返回到池中。 我可以在为另一个 API 请求返回线程的控制器方法中以及在任何第 3 方 API 调用(例如 AWS)中看到这样做的好处。
但是在整个调用堆栈中使用它有什么好处吗? 考虑这个伪代码示例:
public class MyController
public async Task<IActionResult> MyFirstFunction()
{
var result = await _myHandler.MySecondFunction();
...
return Ok();
}
}
public class MyHandler
public Task<bool> MySecondFunction()
{
...
return thirdPartyHandler.ThirdPartyFunction(object);
}
}
public class ThirdPartyHandler
public async Task<bool> ThirdPartyFunction(Object object)
{
return await thirdParty.ExternalFunctionAsync(object);
}
}
这段代码不会实现与使“MySecondFunction”函数异步并等待ThirdPartyFunction() 函数调用相同的事情,而不必处理捕获上下文并将线程返回到池等的开销更少吗?
诚然 MyHandler 和 ThirdPartyHandler 有点多余,可以合并
【问题讨论】:
-
经过考虑,我想我对自己的问题有了答案。除非您需要访问 Task 的结果,否则在中间层中等待是没有意义的。但通常在这种情况下,可能存在架构问题,您可能有可以重构的冗余层
-
另请阅读blog.stephencleary.com/2013/11/there-is-no-thread.html。 “我熟悉异步/等待,使用异步函数在等待时将线程返回到池中” - 没有线程。
async/await并没有专门用线程做任何事情。
标签: .net async-await callstack