首页 > 解决方案 > 同步调用异步嵌套方法 - 异步会沿着路径工作吗?

问题描述

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

标签: c#asynchronousaws-lambda

解决方案


method2并且method3会做他们一直做的任何事情。如果它们在 API 后面是纯同步的Task,那么它们将继续同步;如果它们是异步的,那么它们将继续是异步的。这里唯一的问题是:会LambdaHandler做什么,答案很简单:

  • 它会阻塞直到它们完成

如果它们已经同步完成,那么很好;如果不是,那么您已经在同步异步块中绑定了一个线程。如果您的代码使用只有一个工作人员(这并不罕见)的同步上下文或任务调度程序,这本身可能会导致死锁,因为异步代码需要执行任何后处理的线程将是卡在等待GetResult()。所以异步部分无法完成,GetResult()也无法完成。

您应该避免像瘟疫那样同步异步。它被认为是反模式是有原因的。


推荐阅读