5 异步编程之async和await

在上一篇中,我们探讨了异步编程的基础概念以及它所解决的问题。这一篇我们将深入了解 asyncawait 关键字,这两个关键词是 C# 异步编程的基石,帮助我们编写高效且可读的异步代码。

什么是 asyncawait

asyncawait 关键字使得异步编程更为简单和直观。

  • async:用于修饰一个方法,表明该方法包含异步操作。被标记为 async 的方法必须返回 TaskTask<T>void(仅限于事件处理程序)。
  • await:用于暂停 async 方法的执行,直到其后面的任务完成,并且允许其他操作在此期间执行。

在 C# 中,我们可以通过 Task 对象来表示异步操作,await 关键字会确保代码在任务完成之前不会继续执行。

基本语法

我们首先来看一下使用 asyncawait 的简单示例:

1
2
3
4
5
6
public async Task<string> FetchDataAsync()
{
// 模拟一个异步网络操作
await Task.Delay(2000); // 表示等待2秒
return "数据获取成功!";
}

在这个例子中,方法 FetchDataAsync 被标记为 async,并返回一个 Task<string>await Task.Delay(2000) 让方法在等待 2 秒的同时不会阻塞调用它的线程。

使用场景

asyncawait 非常适合用于 I/O 密集型任务,例如网络请求、文件读写和数据库访问等场景。在这些操作中,I/O 操作通常会导致线程等待,而使用异步编程可以释放这些线程,让它们去处理其它工作。

例子:异步文件读取

以下是一个异步读取文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
public static async Task Main(string[] args)
{
string filePath = "sample.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}

public static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
// 异步读取文件内容
string content = await reader.ReadToEndAsync();
return content;
}
}
}

在这个例子中,ReadFileAsync 异步读取文件的内容,并且使用 await 关键字确保在读取完成之前不继续执行后续代码。

处理异常

在使用 await 的时候,我们同样需要考虑异常处理。异步方法可以抛出异常,如果不加处理,会影响调用这个方法的代码。我们可以使用 try-catch 语句来捕获这些异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static async Task<string> FetchDataAsync()
{
try
{
await Task.Delay(2000); // 模拟网络请求
throw new Exception("获取数据时出现错误!");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
return "错误处理完成";
}
}

通过在异步方法中加入异常处理,能够确保即使发生了错误,程序也不会崩溃,并能恰当地处理错误信息。

总结

在本文中,我们详细探讨了 asyncawait 关键字的使用方法与场景。它们让 C# 异步编程变得简单且可读,极大地提高了开发效率。通过上述示例,您应该能够了解如何在实际开发中灵活运用这两个关键字。

在下一篇中,我们将进一步探讨异步编程中的任务与多线程的内容,届时我们将更加深入措施并结合更多实际案例进行讲解。

5 异步编程之async和await

https://zglg.work/csharp-one/5/

作者

IT教程网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论