.NET C# 异步编程是为了编写高效、响应迅速的应用程序而设计的编程模式。它主要通过 async
和 await
关键字来实现异步操作,使代码更加简洁和可读。下面是对 C# 异步编程的一些关键概念和技术的详细解释:
基本概念
异步方法:
- 异步方法使用
async
修饰符定义,返回类型通常是 Task
、Task<T>
或 void
(仅限于事件处理程序)。
- 异步方法可以包含
await
表达式,用于暂停方法执行,直到异步操作完成。
await
表达式:
await
用于暂停异步方法的执行,等待异步操作完成,然后继续执行方法中的后续代码。
await
可以用于任何返回 Task
或 Task<T>
的方法。
示例代码
异步方法示例
1 2 3 4 5 6
| public async Task<int> GetDataAsync() { await Task.Delay(1000); return 42; }
|
使用 await
调用异步方法
1 2 3 4 5
| public async Task ProcessDataAsync() { int result = await GetDataAsync(); Console.WriteLine($"Result: {result}"); }
|
异步编程的好处
提高应用程序响应性:
- 异步操作可以避免阻塞主线程,特别是在 GUI 应用程序中,避免冻结界面。
更好的资源利用:
- 异步编程可以更高效地利用系统资源,允许 CPU 在等待 I/O 操作完成时执行其他任务。
简化异步代码:
- 使用
async
和 await
关键字,可以让异步代码看起来像同步代码,更容易编写和维护。
常用的异步方法和模式
异步 I/O 操作
在 .NET 中,许多 I/O 操作都支持异步方法。例如,读取文件内容可以使用 StreamReader
的 ReadToEndAsync
方法:
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}"); } }
|