#unity/日常积累 # await 运算符 - 异步等待任务完成 `await` 运算符暂停对其所属的 [async](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async) 方法的求值,直到其操作数表示的异步操作完成。 异步操作完成后,`await` 运算符将返回操作的结果(如果有)。 当 `await` 运算符应用到表示已完成操作的操作数时,它将立即返回操作的结果,而不会暂停其所属的方法。 `await` 运算符不会阻止计算异步方法的线程。 当 `await` 运算符暂停其所属的异步方法时,控件将返回到方法的调用方。 在下面的示例中,[HttpClient.GetByteArrayAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient.getbytearrayasync) 方法返回 `Task` 实例,该实例表示在完成时生成字节数组的异步操作。 在操作完成之前,`await` 运算符将暂停 `DownloadDocsMainPageAsync` 方法。 当 `DownloadDocsMainPageAsync` 暂停时,控件将返回到 `Main` 方法,该方法是 `DownloadDocsMainPageAsync` 的调用方。 `Main` 方法将执行,直至它需要 `DownloadDocsMainPageAsync` 方法执行的异步操作的结果。 当 [GetByteArrayAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient.getbytearrayasync) 获取所有字节时,将计算 `DownloadDocsMainPageAsync` 方法的其余部分。 之后,将计算 `Main` 方法的其余部分。 ``` cs public class AwaitOperator { public static async Task Main() { Task downloading = DownloadDocsMainPageAsync(); Console.WriteLine($"{nameof(Main)}: Launched downloading."); int bytesLoaded = await downloading; Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes."); } private static async Task DownloadDocsMainPageAsync() { Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading."); var client = new HttpClient(); byte[] content = await client.GetByteArrayAsync("https://learn.microsoft.com/en-us/"); Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading."); return content.Length; } } // Output similar to: // DownloadDocsMainPageAsync: About to start downloading. // Main: Launched downloading. // DownloadDocsMainPageAsync: Finished downloading. // Main: Downloaded 27700 bytes. ``` 必须提供 `await` 表达式的操作数,才能在任务完成时进行通知。 通常,任务完成时(无论成功还是失败)都会调用委托。 C# 语言规范的 [`await`](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/expressions#1298-await-expressions) 部分提供了有关如何实现这些通知的详细信息。 前一个示例使用[异步 `Main` 方法](https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/program-structure/main-command-line)。 有关详细信息,请参阅 [Main 方法中的 await 运算符](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/await#await-operator-in-the-main-method)部分。