繁体   English   中英

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

[英]Sync calling async nested methods - Will async work down the path?

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

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

  • 它将阻塞直到完成

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

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

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

但是整个事情都会阻塞并等待任务完成。

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

帮助链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM