登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
C# 异步编程:从 async/await 到 Task 并行库的全面解析 ...
C# 异步编程:从 async/await 到 Task 并行库的全面解析
[ 复制链接 ]
鄂缮输
2025-9-24 16:46:14
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
引言
在现代软件开发中,处理高并发和耗时操作是一个常见的挑战。C# 提供了强大的异步编程模型,它允许程序在执行耗时操作时不会阻塞主线程,从而提高程序的响应性和性能。其中,async/await 关键字和 Task 并行库是 C# 异步编程的核心组成部分。深入理解和掌握这些技术,对于开发高效、稳定的应用程序至关重要。本文将全面解析从 async/await 到 Task 并行库的相关知识,帮助开发者更好地运用 C# 进行异步编程。
正文
异步编程基础
在传统的同步编程中,程序按照顺序依次执行每一条语句。当遇到耗时操作时,主线程会被阻塞,直到操作完成才能继续执行后续代码。这在处理 I/O 密集型或 CPU 密集型任务时,会导致程序响应变慢,用户体验变差。而异步编程则允许程序在执行耗时操作时,将控制权交还给调用者,继续执行其他任务,当耗时操作完成后再回来处理结果。
async/await 关键字
基本概念
async 和 await 是 C# 引入的用于简化异步编程的关键字。async 用于修饰方法,表示该方法是一个异步方法。异步方法可以包含 await 表达式,用于等待一个 Task 或 Task 完成。当遇到 await 表达式时,异步方法会暂停执行,将控制权返回给调用者,直到等待的任务完成,然后继续执行后续代码。
示例代码
以下是一个简单的使用 async/await 的示例:
csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("开始执行异步任务");
await LongRunningTask();
Console.WriteLine("异步任务执行完成");
}
static async Task LongRunningTask()
{
await Task.Delay(2000); // 模拟一个耗时 2 秒的操作
Console.WriteLine("耗时操作完成");
}
}
复制代码
在这个示例中,Main 方法被标记为 async,因为它调用了一个异步方法 LongRunningTask。LongRunningTask 方法内部使用 await Task.Delay(2000) 模拟了一个耗时 2 秒的操作。当执行到 await Task.Delay(2000) 时,LongRunningTask 方法会暂停执行,将控制权返回给 Main 方法,Main 方法可以继续执行其他任务。当 Task.Delay(2000) 完成后,LongRunningTask 方法会继续执行后续代码。
Task 并行库
Task 类
Task 类是 Task 并行库的核心,它表示一个异步操作。可以通过 Task.Run 方法创建一个新的 Task 来执行一个异步操作。例如:
csharp
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Console.WriteLine("开始执行任务");
Task task = Task.Run(() =>
{
// 模拟一个耗时操作
for (int i = 0; i < 1000000; i++)
{
// 一些计算密集型操作
}
Console.WriteLine("任务执行完成");
});
task.Wait(); // 等待任务完成
Console.WriteLine("程序结束");
}
}
复制代码
在这个示例中,Task.Run 方法接受一个 Action 委托,该委托包含了要执行的异步操作。task.Wait() 方法用于等待任务完成,确保主线程在任务完成后再继续执行后续代码。
Task 类
Task 是 Task 的泛型版本,它表示一个返回结果的异步操作。例如:
csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("开始执行任务");
Task<int> task = CalculateAsync();
int result = await task;
Console.WriteLine($"任务结果: {result}");
}
static async Task<int> CalculateAsync()
{
await Task.Delay(2000); // 模拟一个耗时 2 秒的操作
return 42;
}
}
复制代码
在这个示例中,CalculateAsync 方法返回一个 Task,表示一个返回 int 类型结果的异步操作。在 Main 方法中,使用 await 关键字等待任务完成,并获取任务的结果。
并行任务处理
Task 并行库还提供了一些方法来处理多个并行任务,例如 Task.WhenAll 和 Task.WhenAny。
Task.WhenAll:等待所有指定的任务完成。
csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Task task1 = Task.Run(() =>
{
// 模拟一个耗时操作
for (int i = 0; i < 1000000; i++)
{
// 一些计算密集型操作
}
Console.WriteLine("任务 1 完成");
});
Task task2 = Task.Run(() =>
{
// 模拟一个耗时操作
for (int i = 0; i < 1000000; i++)
{
// 一些计算密集型操作
}
Console.WriteLine("任务 2 完成");
});
await Task.WhenAll(task1, task2);
Console.WriteLine("所有任务完成");
}
}
复制代码
Task.WhenAny:等待任何一个指定的任务完成。
csharp
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Task task1 = Task.Run(() =>
{
// 模拟一个耗时操作
for (int i = 0; i < 1000000; i++)
{
// 一些计算密集型操作
}
Console.WriteLine("任务 1 完成");
});
Task task2 = Task.Run(() =>
{
// 模拟一个耗时操作
for (int i = 0; i < 1000000; i++)
{
// 一些计算密集型操作
}
Console.WriteLine("任务 2 完成");
});
Task completedTask = await Task.WhenAny(task1, task2);
Console.WriteLine("有一个任务完成");
}
}
复制代码
异步编程的应用场景
I/O 密集型任务
在处理 I/O 密集型任务时,如文件读写、网络请求等,异步编程可以显著提高程序的性能。因为在等待 I/O 操作完成时,程序可以继续执行其他任务,而不是阻塞主线程。例如,在一个 Web 应用程序中,使用异步编程处理数据库查询或 HTTP 请求,可以提高应用程序的并发处理能力。
CPU 密集型任务
对于 CPU 密集型任务,如复杂的计算、数据处理等,虽然异步编程本身不能直接提高 CPU 的处理速度,但可以通过并行执行多个任务,充分利用多核处理器的性能。例如,在一个图像处理应用程序中,可以使用 Task 并行库并行处理多个图像,提高处理效率。
结论
C# 的异步编程模型,特别是 async/await 关键字和 Task 并行库,为开发者提供了强大的工具来处理高并发和耗时操作。通过合理运用这些技术,可以提高程序的响应性和性能,提升用户体验。在实际开发中,需要根据具体的应用场景选择合适的异步编程方法,同时要注意处理异常和资源管理等问题,确保程序的稳定性和可靠性。开发者应该不断学习和实践,深入掌握 C# 异步编程的精髓,为开发高质量的应用程序打下坚实的基础。
GrapeCity Documents for Excel
Spread .NET
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
异步
编程
async
await
Task
相关帖子
网页端3D编程小实验-一种即时战略游戏的编程原型
超参数调整,批量标准化和编程框架(一)超参数调整
超参数调整,批量标准化和编程框架(三)多值预测与多分类
超参数调整,批量标准化和编程框架(四)编程框架
Linux命令行与Shell脚本编程大全笔记
超参数调整,批量标准化和编程框架 课后习题和代码实践
推荐一种手动设置异步线程等待机制的解决方案
AI 编程协作,我的一点邪修方法,希望可以帮助到你
AiStudio才是Gemini模型的编程真身!
同事突然问我:异步网络请求编码的方法
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
网页端3D编程小实验-一种即时战略游戏的编程原型
2
37
唐茗
2025-11-12
业界
超参数调整,批量标准化和编程框架(一)超参数调整
1
830
埤兆
2025-11-17
业界
超参数调整,批量标准化和编程框架(三)多值预测与多分类
1
73
垢峒
2025-11-18
业界
超参数调整,批量标准化和编程框架(四)编程框架
0
452
窖咎
2025-11-20
安全
Linux命令行与Shell脚本编程大全笔记
0
660
吉娅寿
2025-11-26
业界
超参数调整,批量标准化和编程框架 课后习题和代码实践
1
39
迭婵椟
2025-11-29
安全
推荐一种手动设置异步线程等待机制的解决方案
3
568
褥师此
2025-12-01
业界
AI 编程协作,我的一点邪修方法,希望可以帮助到你
0
210
嗅叽
2025-12-03
科技
AiStudio才是Gemini模型的编程真身!
1
209
莠畅缕
2025-12-06
安全
同事突然问我:异步网络请求编码的方法
0
228
能拘
2025-12-09
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
鄂缮输
2025-9-24 16:46:14
关注
0
粉丝关注
18
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845356
3934307807
991123
4
xiangqian
638210
5
宋子
9984
6
韶又彤
9998
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
803
postgreSQL 中的自定义操作符
683
ROS2核心概念之通信接口
474
拿着顶级服务器跑慢查询,就像开着法拉利送
16
一文打通软件测试中pytest框架
947
vscode远程调试python程序,基于debugpy库
318
正点原子HP20智能加热台,重新定义精密加热
716
K8S 中使用 YAML 安装 ECK
1000
一种可落地的任务令牌锁机制:设计原理、实
150
Flink学习笔记:状态类型和应用
581
Oracle19c impdp失败报ORA-20000案例
205
Markdown写作常用组件
714
fs1.6-fs1.10代码移植方案
48
大疆不同任务类型执行逻辑,上云API源码分
547
对标MinIO!全新一代分布式文件系统诞生!
247
上海房屋漏水反复修不好?芮生建设提供免费
927
2025 年度西安网站制作公司推荐:定制开发
414
15.结构型 - 组合模式 (Composite Pattern)
173
C++ 语言特性的变更可能让你的防御成为马奇
280
CentOS 7 上 yt-dlp Youtube高画质下载问题
925
短视频 / 图片不够清?SeedVR2.5 超分操作