异步

.NET C# 异步编程是为了编写高效、响应迅速的应用程序而设计的编程模式。它主要通过 asyncawait 关键字来实现异步操作,使代码更加简洁和可读。下面是对 C# 异步编程的一些关键概念和技术的详细解释:

基本概念

  1. 异步方法

    • 异步方法使用 async 修饰符定义,返回类型通常是 TaskTask<T>void(仅限于事件处理程序)。
    • 异步方法可以包含 await 表达式,用于暂停方法执行,直到异步操作完成。
  2. await 表达式

    • await 用于暂停异步方法的执行,等待异步操作完成,然后继续执行方法中的后续代码。
    • await 可以用于任何返回 TaskTask<T> 的方法。

示例代码

异步方法示例

1
2
3
4
5
6
public async Task<int> GetDataAsync()
{
// 模拟异步操作,例如从网络获取数据
await Task.Delay(1000); // 1秒的延迟,模拟异步操作
return 42;
}

使用 await 调用异步方法

1
2
3
4
5
public async Task ProcessDataAsync()
{
int result = await GetDataAsync();
Console.WriteLine($"Result: {result}");
}

异步编程的好处

  1. 提高应用程序响应性

    • 异步操作可以避免阻塞主线程,特别是在 GUI 应用程序中,避免冻结界面。
  2. 更好的资源利用

    • 异步编程可以更高效地利用系统资源,允许 CPU 在等待 I/O 操作完成时执行其他任务。
  3. 简化异步代码

    • 使用 asyncawait 关键字,可以让异步代码看起来像同步代码,更容易编写和维护。

常用的异步方法和模式

异步 I/O 操作

在 .NET 中,许多 I/O 操作都支持异步方法。例如,读取文件内容可以使用 StreamReaderReadToEndAsync 方法:

1
2
3
4
5
6
7
public async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
return await reader.ReadToEndAsync();
}
}

异步 HTTP 请求

通过 HttpClient 类,可以方便地进行异步 HTTP 请求:

1
2
3
4
5
6
7
8
9
public async Task<string> FetchDataFromApiAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}

并行执行多个异步操作

可以使用 Task.WhenAll 方法并行执行多个异步操作:

1
2
3
4
5
6
7
8
9
10
11
12
public async Task ProcessMultipleTasksAsync()
{
Task<int> task1 = GetDataAsync();
Task<string> task2 = ReadFileAsync("example.txt");

await Task.WhenAll(task1, task2);

int result1 = await task1;
string result2 = await task2;

Console.WriteLine($"Result1: {result1}, Result2: {result2}");
}

异常处理

异步方法中的异常可以使用 try-catch 进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
public async Task ProcessDataWithErrorHandlingAsync()
{
try
{
int result = await GetDataAsync();
Console.WriteLine($"Result: {result}");
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}

异步
https://newztx.github.io/2024/07/24/异步/
作者
Cranky Dove
发布于
2024年7月24日
许可协议