View a markdown version of this page

使用异步编程 适用于 .NET 的 AWS SDK - 适用于 .NET 的 AWS SDK (V4)

的第 4 版 (V4) 适用于 .NET 的 AWS SDK 已经发布!

有关重大更改和迁移应用程序的信息,请参阅迁移主题

Orange button with text "Click here for details".

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用异步编程 适用于 .NET 的 AWS SDK

适用于 .NET 的 AWS SDK 使用Task-based 异步模式 (TAP) 实现其异步实现。要了解有关 TAP 的更多信息,请参阅 docs.microsoft.com 上的Task-based 异步模式 (TAP)。

本主题概述了如何在呼叫 AWS 服务客户端时使用 TAP。

适用于 .NET 的 AWS SDK API 中的异步方法是基于Task类或Task<TResult>类的操作。有关以下这些类的信息,请参阅 docs.microsoft.com:Task 类Task<TResult> 类

在您的代码中调用这些 API 方法时,必须在使用 async 关键字声明的函数中调用,如以下示例所示。

static async Task Main(string[] args) { ... // Call the function that contains the asynchronous API method. // Could also call the asynchronous API method directly from Main // because Main is declared async var response = await ListBucketsAsync(); Console.WriteLine($"Number of buckets: {response.Buckets.Count}"); ... } // Async method to get a list of Amazon S3 buckets. private static async Task<ListBucketsResponse> ListBucketsAsync() { ... var response = await s3Client.ListBucketsAsync(); return response; }

如前面的代码片段所示,async 声明的首选范围是 Main 函数。设置此 async 范围可确保要求对 AWS 服务客户端的调用都是异步的。如果由于某种原因无法声明 Main 为异步,则可以在除 Main 之外的函数上使用 async 关键字,然后从那里调用 API 方法,如以下示例所示。

static void Main(string[] args) { ... Task<ListBucketsResponse> response = ListBucketsAsync(); Console.WriteLine($"Number of buckets: {response.Result.Buckets.Count}"); ... } // Async method to get a list of Amazon S3 buckets. private static async Task<ListBucketsResponse> ListBucketsAsync() { ... var response = await s3Client.ListBucketsAsync(); return response; }

请注意使用此模式时 Main 所需的特殊 Task<> 语法。此外,您必须使用响应的 Result 成员来获取数据。

警告

阻塞使用ResultWait()、或GetAwaiter().GetResult()是异步同步模式的异步调用。只有在没有控制台的简单控制台Main中才能接受SynchronizationContext。在ASP.NET、Windows FormsWPF、和中Blazor WebAssembly,这种模式可能会导致线程池枯竭或死锁。任何一种结果都会导致您的应用程序挂起。最好声明Main为,async然后使用await,如第一个示例所示。有关更多信息,请参阅 async/await 正确使用

您可以在(简单跨平台应用程序基于 Windows 的简单应用程序创建简单的应用程序部分和中查看异步调用 AWS 服务客户端的完整示例引导式代码示例