C# async/await 请解说下原理,以及怎么用的?
时间: 2024-09-25 20:15:09 浏览: 45
C# 的 async/await 是一种基于承诺(Promises)的异步编程模型,它结合了回调函数和生成器的概念,使得编写异步代码变得更加直观和易读。其原理主要包括以下几个方面:
1. **返回一个`Task`或`Task<T>`**:当使用 `async` 关键字修饰方法时,它会自动返回一个 `Task` 或者泛型形式的 `Task<T>`。这代表方法的主体部分将在另一个线程上运行,当前线程则立即返回并继续执行其他代码。
2. **`await`关键字暂停和恢复**:当你在一个 `async` 方法中遇到 `await` 关键字时,程序会暂停当前任务,直到等待的操作完成。然后,控制权会返回到 `await` 语句的前一行,继续执行后续代码。
3. **`await`后面跟的是`Task`或`ValueTask`**:`await` 后面可以跟 `Task`, `Task<T>`, `ValueTask`, 或实现了 `IAsyncStateMachine` 接口的生成器。这允许你在不同的上下文中灵活地处理异步操作的结果。
4. **异步方法内部的执行**:实际上,`await` 后面的操作会被放入一个名为 "awaiter" 的内部状态机中。这个状态机会跟踪异步操作的进度,并在适当的时候调用相应的回调(如 `OnCompleted`)。
使用示例:
```csharp
async Task DownloadFileAsync(string url)
{
try
{
using var client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(url);
// 检查是否成功
if (!response.IsSuccessStatusCode)
throw new Exception("Failed to download file");
string content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
```
在这个例子中,`DownloadFileAsync` 方法首先发起 HTTP 请求,如果请求成功,则读取响应内容;如果请求失败,捕获异常并打印错误信息。整个过程是非阻塞的,提高了应用程序的响应性和用户体验。
阅读全文