我的库中有一个异步方法,并且顶级调用是在AWS Lambda函数的处理程序中同步进行的(出于某些原因,此处不再讨论)。我想知道是否有任何电话是异步的?还是因为第一个调用者是同步进行的,否则一切都会同步吗?
public void LambdaHandler(Input inp, ILambdaContext context)
{
method1().GetAwaiter().GetResult();
}
private async Task method1()
{
await method2();
await method3();
}
private async Task method2()
{
//do something
}
private async Task method3()
{
//do something
}
答案 0 :(得分:3)
method2
和method3
会执行他们一直以来所做的。如果它们在Task
API之后是纯同步的,则它们将继续同步;如果它们是异步的,那么它们将继续是异步的。这里唯一的问题是:LambdaHandler
会做什么,答案很简单:
如果它们已经同步完成,那就好了;如果它们没有,那么您将线程捆绑在sync-over-async块中。如果您的代码使用仅具有单个工作程序的同步上下文或任务计划程序(这并不罕见),则这可能本身导致死锁,因为异步代码需要使用线程做任何后处理都将停留在GetResult()
上。因此异步部分无法完成,GetResult()
也无法完成。
您应避免像瘟疫一样在异步之上同步。有理由将其视为反模式。
答案 1 :(得分:0)