异步编程入门
开发人员使用异步编程技术来避免性能瓶颈,并提高应用程序的整体响应能力。 但是,编写异步应用程序的传统技术可能很复杂,因此难以编写、调试和维护。
C# 支持简化的异步编程方法,该方法利用 .NET 运行时中的异步支持。 编译器执行开发人员用来执行的困难工作,并且应用程序保留类似于同步代码的逻辑结构。 因此,你只需付出一小部分精力即可获得异步编程的所有优势。
了解异步进程在现实世界中的工作原理有助于了解如何在应用程序中使用异步编程。
在现实世界中检查异步流程
做早餐是一个从异步执行任务中获益的过程的好例子。 可以将早餐视为一系列可以同步或异步执行的任务。
- 从储藏室中拿出早餐食材。
- 倒一杯咖啡。
- 加热锅,然后炒三片熏肉。
- 炸两个鸡蛋。
- 烤两块面包。
- 将黄油和果酱涂抹在烤面包片上。
- 倒一杯橙汁。
如果你有烹饪经验,则可以异步完成这些说明。 你开始加热锅准备煎熏肉和鸡蛋,然后从储藏室取出所需的食材。 你把面包放在烤箱里,然后开始煮培根。 在流程的每个步骤中,你启动一个任务,然后转向需要你注意的其他任务。
烹饪早餐是异步而非并行工作的一个很好的示例。 一个人(或线程)可以处理所有任务。 一个人可以通过在上一个任务完成之前启动下一个任务来异步做早餐。 不论是否有人在观看,每个烹饪任务都会继续进行。 一旦你开始加热锅,你就可以从储藏室里拿食材。 培根开始煮熟后,可以将面包放在烤箱中。
对于并行算法,需要多个厨师(或多个线程)。 一个人煮鸡蛋,另一个炸熏肉,等等。 每个人专注于他们的一个特定任务。 正在烹饪(或每个线程)的每个人都被同步阻止,等待当前任务完成:培根可以翻面了,面包在烤面包机里马上就要弹出来了,诸如此类。
通过使用异步编程技术,可以提高应用程序的效率和响应能力,就像一次执行多个任务来更高效地做早餐一样。
异步可提高响应能力
异步性对于可能会导致阻塞的活动(例如 Web 访问)至关重要。 有时,对 Web 资源的访问速度缓慢或延迟。 如果在同步进程中阻止此类活动,则整个应用程序必须等待。 在异步进程中,应用程序可以继续执行其他不依赖于 Web 资源的工作,直到潜在的阻塞任务完成。
下表显示了异步编程提高响应能力的典型区域。 .NET 和 Windows 运行时中列出的 API 包含支持异步编程的方法。
| 应用程序区域 | 使用异步方法的 .NET 类型 | 使用异步方法的 Windows 运行时类型 |
|---|---|---|
| 网络访问 | HttpClient | Windows.Web.Http.HttpClient、SyndicationClient |
| 使用文件 | JsonSerializer、StreamReader、StreamWriter 等。 | StorageFile |
| 使用映像 | MediaCapture、BitmapEncoder、BitmapDecoder | |
| WCF 编程 | 同步和异步操作 |
如何创建和调用异步方法
在 C# 中,异步操作是使用 async 和 await 关键字实现的。 关键字 async 用于定义异步方法,而 await 关键字用于调用异步方法并等待其结果而不阻止调用线程。 异步操作通常使用 Task 或 Task<T> 类型来实现,这些类型表示可以等待的进行中的操作。
下面是有关如何在 C# 中创建和调用异步任务的示例:
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string filePath = "example.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 是使用 async 关键字定义的,并且返回类型为 Task<string>. 关键字 async 指示该方法包含异步作,返回类型 Task<string> 指示该方法返回表示异步作的任务。 该 Task<string> 类型是一个泛型任务,表示返回字符串值的异步作。 该方法 ReadFileAsync 采用文件路径作为参数,并异步读取文件的内容。
该方法Main还定义为异步方法,允许它使用ReadFileAsync关键字调用await该方法。 关键字 await 用于指示程序应在继续作之前等待异步作的结果。 在这种情况下,程序会在将文件内容打印到控制台之前等待读取。
概要
在本单元中,你了解了异步编程的优点,以及如何提高应用程序的响应能力。 你还学习了如何使用 C# 中的 async 和 await 关键字创建和调用异步方法。 通过使用这些技术,可以编写更高效且响应式的应用程序,这些应用程序可以处理潜在的阻塞作,而无需冻结用户界面或阻止其他任务。
要点
- 异步编程增强了应用程序性能和响应能力。
- C# 提供了一种简化的异步编程方法。
- 异步编程在可能阻止 Web 访问等活动方面非常有用。
- 在 C# 中,异步方法是使用
async关键字创建的,并使用await关键字调用。 -
Task类型或Task<T>类型表示可以在 C# 中等待的正在进行的操作。