C#中如何使用异步编程

news/2025/1/20 0:35:52/

在 C# 中,异步编程主要通过 async 和 await 关键字来实现。异步编程的目的是让程序在执行耗时操作(如 I/O 操作、网络请求等)时不会阻塞主线程,从而提高程序的性能。

1. 异步编程的核心概念

async 关键字

  • 用于标记一个方法为异步方法。

  • 异步方法的返回类型通常是 TaskTask<T> 或 ValueTask

  • Task:表示一个没有返回值的异步操作。

  • Task<T>:表示一个返回类型为 T 的异步操作。

  • ValueTask:轻量版的 Task,适用于高性能场景。

await 关键字

  • 用于暂停异步方法的执行,直到等待的任务完成。

  • await 只能用于 async 方法中。

  • 它不会阻塞线程,而是将控制权交回给调用方,直到任务完成后再恢复执行。

2. 异步编程的基本语法

定义异步方法

public async Task GetDataAsync()
{// 异步操作await Task.Delay(1000); // 模拟耗时操作
}

调用异步方法

public async Task CallAsyncMethod()
{await GetDataAsync(); // 等待异步方法完成Console.WriteLine("异步方法已调用.");
}

3. 异步编程的使用场景

I/O 密集型操作
  • 文件读写、数据库查询、网络请求等操作通常需要较长时间,使用异步编程可以避免阻塞主线程。

UI 应用程序
  • 在桌面或移动应用程序中,保持 UI 线程的响应性极为重要。异步操作可以防止 UI 卡顿,提升用户体验。

Web 应用程序
  • 在 ASP.NET 等 Web 应用程序中,异步操作可以提高服务器的吞吐量,处理更多的并发请求。

并行任务
  • 当需要同时执行多个独立的任务时,可以使用异步编程来提高效率。

4. 异步编程的示例

1:简单的异步方法

using System;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){Console.WriteLine("开始异步操作...");await DoSomethingAsync();Console.WriteLine("异步操作已完成.");}static async Task DoSomethingAsync(){await Task.Delay(2000); // 模拟耗时操作(2秒)Console.WriteLine("DoSomethingAsync方法异步任务已完成.");}
}

输出:

开始异步操作...
DoSomethingAsync方法异步任务已完成.
异步操作已完成.

2:异步文件读写

using System;
using System.IO;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){string filePath = "task-test.txt";string content = "hello async";// 异步写入文件await WriteFileAsync(filePath, content);Console.WriteLine("文件已写入");// 异步读取文件string readContent = await ReadFileAsync(filePath);Console.WriteLine("文件内容: " + readContent);}static async Task WriteFileAsync(string filePath, string content){await File.WriteAllTextAsync(filePath, content);}static async Task<string> ReadFileAsync(string filePath){return await File.ReadAllTextAsync(filePath);}
}

输出:

文件已写入
文件内容: hello async

3:异步网络请求

using System;
using System.Net.Http;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){string url = "https://xxxxx.com";string content = await DownloadContentAsync(url);Console.WriteLine("Content: " + content);}static async Task<string> DownloadContentAsync(string url){using (HttpClient client = new HttpClient()){return await client.GetStringAsync(url);}}
}

4:并行异步任务

using System;
using System.Net.Http;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){Task<string> task1 = DownloadContentAsync("https://xxx.com");Task<string> task2 = DownloadContentAsync("https://xxx2.com");string[] results = await Task.WhenAll(task1, task2);Console.WriteLine("Task 1 result: " + results[0]);Console.WriteLine("Task 2 result: " + results[1]);}static async Task<string> DownloadContentAsync(string url){using (HttpClient client = new HttpClient()){return await client.GetStringAsync(url);}}
}

5. 异步编程的注意事项

1、避免 async void

• 除了事件处理程序外,尽量避免使用 async void 方法,因为它无法被等待,且异常无法被捕获。

2、正确处理异常:

• 使用 try-catch 块来捕获异步方法中的异常。

try
{await GetDataAsync();
}
catch (Exception ex)
{Console.WriteLine("Error: " + ex.Message);
}

3、避免阻塞异步代码:

• 不要使用 .Result 或 .Wait() 来阻塞异步任务,这可能导致死锁。

• 始终使用 await 来等待异步任务。

  • 4、性能优化:

    • 对于高性能场景,可以使用 ValueTask 代替 Task

6. 异步编程的好处

1、提高响应性:

• 异步操作不会阻塞主线程,使得应用程序在等待耗时操作时保持响应。

2、提高资源利用率:

• 异步操作可以更高效地利用系统资源,特别是在 I/O 密集型操作中。

3、简化代码:

• 使用 async 和 await 可以使异步代码的结构更加清晰,易于理解和维护。

总结

C# 中的异步编程通过 async 和 await 关键字实现,能够显著提高程序的响应性和性能。它特别适用于 I/O 密集型操作、UI 应用程序和 Web 应用程序等场景。通过合理使用异步编程,可以编写出高效、简洁且易于维护的代码。

文章转载自:代码拾光

原文链接:C#中如何使用异步编程 - 代码拾光 - 博客园

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.ppmy.cn/news/1564532.html

相关文章

Java 静态导入:规则、实践与应用场景

Java 编程中&#xff0c;“静态导入”&#xff08;import static&#xff09;自 Java 5 引入&#xff0c;是提升代码可读性和编写效率的技巧。但需正确恰当使用。本文探讨其机制、规则、常见错误及在实际开发中的应用。 1. 静态导入介绍 静态导入可让开发者直接访问其他类或接…

LeetCode --- 432周赛

题目列表 3417. 跳过交替单元格的之字形遍历 3418. 机器人可以获得的最大金币数 3419. 图的最大边权的最小值 3420. 统计 K 次操作以内得到非递减子数组的数目 一、跳过交替单元格的之字形遍历 ​​ 题目要求 “之” 字形遍历数组&#xff0c;具体规律如下 具体代码如下 c…

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1&#xff0c;世界坐标系 从这个世界&#xff08;world&#xff09;的视角来看物体 世界坐标系是3D空间坐标&#xff0c;每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2&#xff0c;相机坐标系 相机本身具有一个坐标系&…

技术洞察:C++在后端开发中的前沿趋势与社会影响

文章目录 引言C在后端开发中的前沿趋势1. 高性能计算的需求2. 微服务架构的兴起3. 跨平台开发的便利性 跨领域技术融合与创新实践1. C与人工智能的结合2. C与区块链技术的融合 C对社会与人文的影响1. 提升生产力与创新能力2. 促进技术教育与人才培养3. 技术与人文的深度融合 结…

如何实现工作流自动化?实用案例分享

一、CI/CD 与自动化运维概述 &#xff08;一&#xff09;CI/CD 概念解析 在软件开发领域&#xff0c;CI/CD 是两个极为重要的实践&#xff0c;分别代表持续集成&#xff08;Continuous Integration&#xff09;和持续交付 / 持续部署&#xff08;Continuous Delivery/Continuou…

网络安全防护指南:筑牢网络安全防线(510)

一、网络安全的基本概念 &#xff08;一&#xff09;网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

电梯系统的UML文档05

Dispatcher 不控制实际的电梯组件&#xff0c;但它在软件系统中是重要的。每一个电梯有一个ispatcher&#xff0c;主要功能是计算电梯的移动方向、移动目的地以及保持门的打开时间。它和系统中除灯控制器以外的几乎所有控制对象交互。 安全装置也是一个环境对象&#xff0c;它…