在 .NET Core 中,异步编程是通过 async
和 await
关键字来实现的。这种方式允许你在不阻塞主线程的情况下执行耗时的操作,如 I/O 操作、网络请求等。.NET Core 提供了多种方式来实现异步操作,主要包括使用 Task
、Task<T>
以及 async
/await
语法糖。
异步编程的基本概念
- Task:表示一个可以异步执行的操作。
- Task<T>:表示一个返回类型为
T
的异步操作。 - async:标记方法为异步方法。
- await:等待异步操作完成,并在完成后继续执行后续代码。
实现异步的方式
- 使用 Task 和 Task<T>
- 使用 async 和 await
示例代码
1. 使用 Task 和 Task<T>
using System;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
// 启动异步操作
var task = DoWorkAsync();
// 继续执行其他操作
Console.WriteLine("Doing other work...");
// 等待异步操作完成
task.Wait();
Console.WriteLine("Async operation completed.");
}
static async Task DoWorkAsync()
{
// 模拟耗时操作
await Task.Delay(2000); // 延迟2秒
Console.WriteLine("Work done after 2 seconds.");
}
}
2. 使用 async 和 await
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
// 调用异步方法并等待其完成
string content = await DownloadContentAsync("https://example.com");
Console.WriteLine(content);
// 继续执行其他操作
Console.WriteLine("Other work continues...");
}
static async Task<string> DownloadContentAsync(string url)
{
using (HttpClient client = new HttpClient())
{
// 发送HTTP GET请求并等待响应
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// 读取响应内容
string content = await response.Content.ReadAsStringAsync();
return content;
}
else
{
throw new Exception($"Failed to download content: {response.StatusCode}");
}
}
}
}
解释
Main 方法中的异步调用:
- 在
Main
方法中,我们使用await
来调用DownloadContentAsync
方法。这使得Main
方法本身也必须是异步的,因此我们将其标记为async Task
。 await
关键字会暂停当前方法的执行,直到DownloadContentAsync
完成并返回结果。在此期间,主线程不会被阻塞,可以继续执行其他任务。
- 在
DownloadContentAsync 方法:
- 该方法使用
HttpClient
发送 HTTP GET 请求。 GetAsync
方法返回一个Task<HttpResponseMessage>
,我们使用await
来等待请求完成。- 如果请求成功,我们再使用
ReadAsStringAsync
方法异步读取响应内容,并返回结果。
- 该方法使用
其他异步模式
除了上述基本的异步模式外,.NET Core 还支持其他一些异步编程模式:
- 基于事件的异步模式(EAP, Event-based Asynchronous Pattern):这是 .NET Framework 中的一种旧模式,但在 .NET Core 中已经不推荐使用。
- 基于任务的异步模式(TAP, Task-based Asynchronous Pattern):这是 .NET Core 中推荐的异步模式,上面的例子就是基于 TAP 的。
总结
- Task 和 Task<T> 是 .NET 中用于表示异步操作的基础类。
- async 和 await 是 C# 中用于简化异步编程的关键字。
- 通过这些工具,你可以编写非阻塞的异步代码,提高应用程序的性能和响应性。