同步调用异步嵌套方法-异步会沿路径工作吗?

时间:2019-07-24 06:33:18

标签: c# asynchronous aws-lambda

我的库中有一个异步方法,并且顶级调用是在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
}

2 个答案:

答案 0 :(得分:3)

method2method3会执行他们一直以来所做的。如果它们在Task API之后是纯同步的,则它们将继续同步;如果它们是异步的,那么它们将继续是异步的。这里唯一的问题是:LambdaHandler会做什么,答案很简单:

  • 它将阻止直到完成

如果它们已经同步完成,那就好了;如果它们没有,那么您将线程捆绑在sync-over-async块中。如果您的代码使用仅具有单个工作程序的同步上下文或任务计划程序(这并不罕见),则这可能本身导致死锁,因为异步代码需要使用线程做任何后处理都将停留在GetResult()上。因此异步部分无法完成,GetResult()也无法完成。

您应避免像瘟疫一样在异步之上同步。有理由将其视为反模式。

答案 1 :(得分:0)

调用堆栈下面的方法将异步运行。

但是整个过程都会阻塞,并等待任务完成。

更好的方法是修改LambdaHandler以返回Task并使用await而不是调用GetAwaiter。

Help link

相关问题