#unity/日常积累 # async(C# 参考) 使用 `async` 修饰符可将方法、[lambda 表达式](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/lambda-expressions)或[匿名方法](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/delegate-operator)指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。 如下示例定义了一个名为 `ExampleMethodAsync` 的异步方法: ``` cs public async Task ExampleMethodAsync() { //... } ``` 如果不熟悉异步编程,或者不了解异步方法如何在不阻止调用方线程的情况下使用 [`await` 运算符](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/operators/await)执行可能需要长时间运行的工作,请参阅[使用 Async 和 Await 的异步编程](https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/)中的说明。 如下代码见于一种异步方法中,且调用 [HttpClient.GetStringAsync](https://learn.microsoft.com/zh-cn/dotnet/api/system.net.http.httpclient.getstringasync) 方法: ``` cs string contents = await httpClient.GetStringAsync(requestUrl); ``` 异步方法同步运行,直至到达其第一个 `await` 表达式,此时会将方法挂起,直到等待的任务完成。 同时,如下节示例中所示,控件将返回到方法的调用方。 如果 `async` 关键字修改的方法不包含 `await` 表达式或语句,则该方法将同步执行。 编译器警告将通知你不包含 `await` 语句的任何异步方法,因为该情况可能表示存在错误。 请参阅[编译器警告(等级 1)CS4014](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/compiler-messages/cs4014)。 `async` 关键字是上下文关键字,原因在于只有当它修饰方法、lambda 表达式或匿名方法时,它才是关键字。 在所有其他上下文中,都会将其解释为标识符。 [](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/async#example) ## 示例 下面的示例展示了异步事件处理程序 `StartButton_Click` 和异步方法 `ExampleMethodAsync` 之间的控制结构和流程。 此异步方法的结果是 Web 页面的字符数。 此代码适用于在 Visual Studio 中创建的 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用;请参见有关设置应用的代码注释。 可以在 Visual Studio 中将此代码作为 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用运行。 需要一个名为 `StartButton` 的按钮控件和一个名为 `ResultsTextBox` 的文本框控件。 切勿忘记设置名称和处理程序,以便获得类似于以下代码的内容: ``` cs