对于仅调用外部服务或写入数据存储的微服务功能,是否有必要在C#中使用异步/等待?
我们在AWS Lambdas中编写了大量此类代码,很难确定在这种情况下async / await的实际收益是什么或在什么地方真正有用。对于更传统的IIS Web服务,异步释放了OS中的线程,并允许服务器处理更多请求。
但是对于AWS Lambdas,这些函数每次执行仅处理一个请求(限制为1000个同时执行)。因此,如果我们有一个长时间运行的外部进程或具有大量延迟的外部依赖项,则每个函数的执行都将被挂起,直到外部进程完成(假设Lambda被同步调用)。
这是一个带有三个处理程序的Lambda示例,我将其中第三个放入单独的名为“ DavidSleep”的Lambda中,该Lambda仅表示长期运行的外部依赖项。当我使用前两个处理程序中的任何一个调用另一个名为“ DavidTest”的Lambda时,我看不到异步/等待版本与缺少异步/等待版本的功能或性能没有区别。这两个函数都需要多个并发的Lambda执行,并且花费相同的时间。
因此,异步版本似乎与无异步版本没有区别,但是有什么区别吗?
public class Test
{
private IAmazonLambda lambda;
public Test()
{
lambda = new AmazonLambdaClient();
}
[LambdaSerializer(typeof(JsonSerializer))]
public async Task HandleAsync(Request request)
{
Console.WriteLine($"Executing for { request.Name }");
await lambda.InvokeAsync(new InvokeRequest
{
FunctionName = "DavidSleep",
InvocationType = InvocationType.RequestResponse,
Payload = JsonConvert.SerializeObject(request)
});
}
[LambdaSerializer(typeof(JsonSerializer))]
public void Handle(Request request)
{
Console.WriteLine($"Executing for { request.Name }");
lambda.InvokeAsync(new InvokeRequest
{
FunctionName = "DavidSleep",
InvocationType = InvocationType.RequestResponse,
Payload = …Run Code Online (Sandbox Code Playgroud)