c# - 同步调用异步嵌套方法 - 异步会沿着路径工作吗?
问题描述
我的库中有异步方法,并且顶级调用是在 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
会做他们一直做的任何事情。如果它们在 API 后面是纯同步的Task
,那么它们将继续同步;如果它们是异步的,那么它们将继续是异步的。这里唯一的问题是:会LambdaHandler
做什么,答案很简单:
- 它会阻塞直到它们完成
如果它们已经同步完成,那么很好;如果不是,那么您已经在同步异步块中绑定了一个线程。如果您的代码使用只有一个工作人员(这并不罕见)的同步上下文或任务调度程序,这本身可能会导致死锁,因为异步代码需要执行任何后处理的线程将是卡在等待GetResult()
。所以异步部分无法完成,GetResult()
也无法完成。
您应该避免像瘟疫那样同步异步。它被认为是反模式是有原因的。
推荐阅读
- visual-studio-code - VSCode 和 Jenkinsfiles。如何格式化它们?
- javascript - 如何在不使用 JavaScript 中的输入类型文件的情况下读取包含 html 的文本文件?
- sublimetext3 - Sublime Text 3 JavaScript 自动完成
- python - 在 Pandas 中对 DataFrame 进行排序和切片
- node.js - 为什么我在 node.js 中的不和谐机器人在 } 上显示错误?
- r - 如何使用分隔符将两个向量组合成对
- java - 我想生成一个如果有特殊字符不需要转义的XML文件
- spring - sec:authorize 不适用于带有 hasRole(ROLE_ADMIN) 或其他的 thymeleaf
- java - 将 shell 脚本参数添加到 java 应用程序
- python - 如何使用openpyxl从python中的xlsx文件中读取货币符号?