C# Await/Async
1.await 运算符
官方解释:
await
运算符暂停对其所属的 await
方法的求值,直到其操作数表示的异步操作完成。 异步操作完成后,await
运算符将返回操作的结果(如果有)。 当 await
运算符应用到表示已完成操作的操作数时,它将立即返回操作的结果,而不会暂停其所属的方法。 await
运算符不会阻止计算异步方法的线程。 当 await
运算符暂停其所属的异步方法时,控件将返回到方法的调用方。
在下面的示例中,HttpClient.GetByteArrayAsync 方法返回 Task<byte[]>
实例,该实例表示在完成时生成字节数组的异步操作。 在操作完成之前,await
运算符将暂停 DownloadDocsMainPageAsync
方法。 当 DownloadDocsMainPageAsync
暂停时,控件将返回到 Main
方法,该方法是 DownloadDocsMainPageAsync
的调用方。 Main
方法将执行,直至它需要 DownloadDocsMainPageAsync
方法执行的异步操作的结果。 当 GetByteArrayAsync 获取所有字节时,将计算 DownloadDocsMainPageAsync
方法的其余部分。 之后,将计算 Main
方法的其余部分。

1 using System; 2 using System.Net.Http; 3 using System.Threading.Tasks; 4 5 public class AwaitOperator 6 { 7 public static async Task Main() 8 { 9 Task<int> downloading = DownloadDocsMainPageAsync(); 10 Console.WriteLine($"{nameof(Main)}: Launched downloading."); 11 12 int bytesLoaded = await downloading; 13 Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes."); 14 } 15 16 private static async Task<int> DownloadDocsMainPageAsync() 17 { 18 Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading."); 19 20 var client = new HttpClient(); 21 byte[] content = await client.GetByteArrayAsync("https://docs.microsoft.com/en-us/"); 22 23 Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading."); 24 return content.Length; 25 } 26 } 27 // Output similar to: 28 // DownloadDocsMainPageAsync: About to start downloading. 29 // Main: Launched downloading. 30 // DownloadDocsMainPageAsync: Finished downloading. 31 // Main: Downloaded 27700 bytes.
1.async运算符
官方解释:
使用 async
修饰符可将方法、lambda 表达式或匿名方法指定为异步。 如果对方法或表达式使用此修饰符,则其称为异步方法 。 如下示例定义了一个名为 ExampleMethodAsync
的异步方法:
C#
public async Task<int> ExampleMethodAsync()
{
//...
}
如果不熟悉异步编程,或者不了解异步方法如何在不阻止调用方线程的情况下使用 await
运算符执行可能需要长时间运行的工作,请参阅使用 Async 和 Await 的异步编程中的说明。 如下代码见于一种异步方法中,且调用 HttpClient.GetStringAsync 方法:
string contents = await httpClient.GetStringAsync(requestUrl);
异步方法同步运行,直至到达其第一个 await
表达式,此时会将方法挂起,直到等待的任务完成。 同时,如下节示例中所示,控件将返回到方法的调用方。
如果 async
关键字修改的方法不包含 await
表达式或语句,则该方法将同步执行。 编译器警告将通知你不包含 await
语句的任何异步方法,因为该情况可能表示存在错误。 请参阅编译器警告(等级 1)CS4014。
async
关键字是上下文关键字,原因在于只有当它修饰方法、lambda 表达式或匿名方法时,它才是关键字。 在所有其他上下文中,都会将其解释为标识符。
示例
下面的示例展示了异步事件处理程序 StartButton_Click
和异步方法 ExampleMethodAsync
之间的控制结构和流程。 此异步方法的结果是 Web 页面的字符数。 此代码适用于在 Visual Studio 中创建的 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用;请参见有关设置应用的代码注释。
可以在 Visual Studio 中将此代码作为 Windows Presentation Foundation (WPF) 应用或 Windows 应用商店应用运行。 需要一个名为 StartButton
的按钮控件和一个名为 ResultsTextBox
的文本框控件。 切勿忘记设置名称和处理程序,以便获得类似于以下代码的内容:
<Button Content="Button" HorizontalAlignment="Left" Margin="88,77,0,0" VerticalAlignment="Top" Width="75"
Click="StartButton_Click" Name="StartButton"/>
<TextBox HorizontalAlignment="Left" Height="137" Margin="88,140,0,0" TextWrapping="Wrap"
Text="<Enter a URL>" VerticalAlignment="Top" Width="310" Name="ResultsTextBox"/>
将代码作为 WPF 应用运行:
- 将此代码粘贴到 MainWindow.xaml.cs 中的
MainWindow
类中。 - 添加对 System.Net.Http 的引用。
- 为 System.Net.Http 添加一个
using
指令。
将此代码作为 Windows 应用商店应用运行:
- 将此代码粘贴到 MainPage.xaml.cs 中的
MainPage
类中。 - 为 System.Net.Http 和 System.Threading.Tasks 添加 using 指令。

private async void StartButton_Click(object sender, RoutedEventArgs e) { // ExampleMethodAsync returns a Task<int>, which means that the method // eventually produces an int result. However, ExampleMethodAsync returns // the Task<int> value as soon as it reaches an await. ResultsTextBox.Text += "\n"; try { int length = await ExampleMethodAsync(); // Note that you could put "await ExampleMethodAsync()" in the next line where // "length" is, but due to when '+=' fetches the value of ResultsTextBox, you // would not see the global side effect of ExampleMethodAsync setting the text. ResultsTextBox.Text += String.Format("Length: {0:N0}\n", length); } catch (Exception) { // Process the exception if one occurs. } } public async Task<int> ExampleMethodAsync() { var httpClient = new HttpClient(); int exampleInt = (await httpClient.GetStringAsync("http://msdn.microsoft.com")).Length; ResultsTextBox.Text += "Preparing to finish ExampleMethodAsync.\n"; // After the following return statement, any method that's awaiting // ExampleMethodAsync (in this case, StartButton_Click) can get the // integer result. return exampleInt; } // The example displays the following output: // Preparing to finish ExampleMethodAsync. // Length: 53292
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?