我的库中有异步方法,并且顶级调用是在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
}
method2
和method3
会做什么,他们总是这样做。如果它们在Task
API之后是完全同步的,则它们将继续保持同步;如果它们是异步的,那么它们将继续是异步的。这里唯一的问题是:将LambdaHandler
做什么,答案很简单:
如果它们已经同步完成,那就好了;如果不是,那么您将线程捆绑在sync-over-async块中。如果您的代码使用仅具有单个工作程序的同步上下文或任务计划程序(这并不罕见),则这本身可能导致死锁,因为异步代码将需要执行任何后处理的线程将是坚持等待GetResult()
。因此,异步部分无法完成,GetResult()
也无法完成。
您应该避免像瘟疫一样在异步上同步。有理由将其视为反模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句