C# 异步编程:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# 异步编程:实践完整指南



异步编程是现代 C# 和 .NET 平台开发中的关键概念之一。它允许创建响应式应用程序,在执行耗时操作(如文件读取、数据库查询、HTTP 调用)时不会阻塞执行线程。在本指南中,我们将通过实际示例,使用 async 和 await 关键字,深入探讨 C# 中的异步机制,并介绍最佳实践。



什么是异步编程,为什么需要它?



在同步编程中,每个操作都是按顺序执行的。如果某个方法调用了网络数据下载等操作,执行线程会一直阻塞直到该操作完成。这会导致桌面应用程序界面“卡死”,或在 Web 应用程序中造成服务器资源利用效率低下。



异步编程解决了这个问题:线程不会被阻塞,而是返回到线程池中处理其他任务。当操作完成时,执行会从中断处恢复。



C# 中异步的主要优势:

  • UI 响应性 — 应用程序在执行耗时操作时不会卡死。
  • 服务器可扩展性 — 单个线程可以处理多个请求。
  • 资源高效利用 — 减少线程空闲时间。


C# 中 async 和 await 的基础



async 和 await 关键字是语法糖,简化了异步操作的处理。来看一个基本示例:



using System;using System.Net.Http;using System.Threading.Tasks;

public class AsyncExample{ public async Task<string> DownloadDataAsync(string url) { using (var client = new HttpClient()) { // await 不会阻塞线程 string result = await client.GetStringAsync(url); return result; } }

public async Task RunAsync() { Console.WriteLine("开始下载..."); string data = await DownloadDataAsync("https://api.example.com/data"); Console.WriteLine($"已下载:{data.Length} 个字符"); }}


代码说明:

  • 方法标记为 async — 这允许在方法内部使用 await。
  • 返回类型为 Task<string>(对于 void 方法则为 Task)。
  • await 会暂停方法的执行直到获取结果,但不会阻塞线程。


重要提示: C# 7.1+ 中控制台应用程序的 Main 方法也可以是异步的:

static async Task Main(string[] args){    var example = new AsyncExample();    await example.RunAsync();}


使用 Task 和 Task<T>



Task 类型表示一个异步操作。它可以处于以下状态:等待中 (Pending)、执行中 (Running)、已完成 (Completed)、出错 (Faulted) 或已取消 (Canceled)。



来看一下手动创建和启动任务:



public async Task ProcessDataAsync(){    // 创建一个在线程池中执行的任务    Task<int> task = Task.Run(() =>    {        // 模拟耗时操作        Task.Delay(2000).Wait();        return 42;    });

// 等待结果 int result = await task; Console.WriteLine($"结果:{result}");}


要并行执行多个任务,请使用 Task.WhenAll:



public async Task DownloadMultipleAsync(){    var urls = new[] { "https://site1.com", "https://site2.com", "https://site3.com" };    var tasks =                

博客

书籍推荐