【C#语言】C#同步与异步编程深度解析:让程序学会“一心多用“

news2025/3/25 7:12:41

文章目录

  • ⭐前言
  • ⭐一、同步编程:单线程的线性世界
    • 🌟1、寻找合适的对象
      • ✨1)
    • 🌟7、设计应支持变化
  • ⭐二、异步编程:多任务的协奏曲
  • ⭐三、async/await工作原理揭秘
  • ⭐四、最佳实践与性能陷阱
  • ⭐五、异步编程适用场景
  • ⭐六、性能对比实测
  • ⭐七、异步编程的哲学思考
  • ⭐总结


标题详情
作者JosieBook
头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师
博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C++)、数据库、操作系统、大数据、人工智能、工控、网络、程序人生
口号成为你自己,做你想做的
欢迎三连👍点赞、✍评论、⭐收藏

⭐前言

在现代软件开发中,处理高并发、优化响应速度是每个开发者必须面对的挑战。C#的异步编程模型为我们提供了一把解决这些问题的金钥匙。本文将深入解析同步与异步的本质区别,并通过实际案例演示如何正确使用async/await构建高效应用。

⭐一、同步编程:单线程的线性世界

同步代码示例:

void MakeBreakfast()
{
    Coffee cup = PourCoffee();
    Console.WriteLine("咖啡好了");

    Egg eggs = FryEggs(2);
    Console.WriteLine("鸡蛋好了");

    Bacon bacon = FryBacon(3);
    Console.WriteLine("培根好了");

    Toast toast = ToastBread(2);
    ApplyButter(toast);
    ApplyJam(toast);
    Console.WriteLine("吐司好了");
}

在这个典型的同步示例中:

  • 每个操作必须等待前一个完成

  • 主线程被完全阻塞

  • 总耗时 = 所有操作耗时之和

  • 资源利用率低下

🌟1、寻找合适的对象

✨1)

🌟7、设计应支持变化

⭐二、异步编程:多任务的协奏曲

异步代码示例:

async Task MakeBreakfastAsync()
{
    Task<Coffee> pourCoffeeTask = PourCoffeeAsync();
    Task<Egg> fryEggsTask = FryEggsAsync(2);
    Task<Bacon> fryBaconTask = FryBaconAsync(3);
    Task<Toast> toastTask = ToastBreadAsync(2);

    Coffee cup = await pourCoffeeTask;
    Console.WriteLine("咖啡好了");
    
    await Task.WhenAll(fryEggsTask, fryBaconTask);
    Console.WriteLine("鸡蛋和培根好了");
    
    Toast toast = await toastTask;
    ApplyButter(toast);
    ApplyJam(toast);
    Console.WriteLine("吐司好了");
}

关键改进点:

  • 并行启动多个任务

  • 使用await非阻塞等待

  • 总耗时 ≈ 最耗时任务的耗时

  • 资源利用率最大化

⭐三、async/await工作原理揭秘

async-await流程

  • 状态机魔法:编译器将async方法转换为状态机

  • 上下文保存:遇到await时保存当前上下文

  • 线程释放:返回控制权给调用者

  • 恢复执行:任务完成后在原始上下文恢复

⭐四、最佳实践与性能陷阱

推荐做法:

// 正确使用ConfigureAwait
async Task LoadDataAsync()
{
    var data = await GetDataFromNetworkAsync().ConfigureAwait(false);
    ProcessData(data); // 在任意线程上下文执行
}

// 并行处理优化
async Task ProcessMultipleFilesAsync(IEnumerable<string> files)
{
    var tasks = files.Select(file => ProcessFileAsync(file));
    await Task.WhenAll(tasks);
}

需要避免的陷阱:

// 错误1:async void滥用
async void Button_Click(object sender, EventArgs e)
{
    // 异常无法被捕获
}

// 错误2:死锁场景
var result = GetDataAsync().Result; // UI线程死锁风险

// 错误3:虚假异步
async Task<int> FakeAsync()
{
    Thread.Sleep(1000); // 阻塞调用
    return 42;
}

⭐五、异步编程适用场景

在这里插入图片描述

⭐六、性能对比实测

测试代码:

// 同步版本
void SyncDownload()
{
    for(int i=0; i<10; i++){
        var data = new WebClient().DownloadData(urls[i]);
    }
}

// 异步版本
async Task AsyncDownload()
{
    var tasks = urls.Select(url => 
        new HttpClient().GetByteArrayAsync(url));
    await Task.WhenAll(tasks);
}

在这里插入图片描述

⭐七、异步编程的哲学思考

  • 资源观:线程是宝贵资源,异步是节约线程的艺术

  • 响应式设计:保持UI流畅的核心解决方案

  • 并发模型:不同于多线程的协作式多任务

  • 架构影响:从底层到顶层的异步化改造

⭐总结

掌握异步编程如同获得程序世界的"分身术",但要真正发挥其威力,需要深入理解其工作原理,并遵循最佳实践。记住:

  • 异步不等于多线程,但可以更好利用多线程

  • 不要为了异步而异步,识别真正受益场景

  • 异步代码需要配套的异常处理和取消机制

  • 逐步改造现有代码,保持兼容性


标题详情
作者JosieBook
头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师
博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C++)、数据库、操作系统、大数据、人工智能、工控、网络、程序人生
口号成为你自己,做你想做的
欢迎三连👍点赞、✍评论、⭐收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划入门详解

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种算法思想&#xff0c;它将问题分解为更小的子问题&#xff0c;然后将子问题的解存起来&#xff0c;避免重复计算。 所以动态规划中每一个状态都是由上一个状态推导出来的&#xff0c;这一点就区别…

SOFABoot-09-模块隔离

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFABoot-00-sofaboot 概览 SOFABoot-01-蚂蚁金服开源的 s…

基于基于eFish-SBC-RK3576工控板的智慧城市边缘网关

此方案充分挖掘eFish-SBC-RK3576的硬件潜力&#xff0c;可快速复制到智慧园区、交通枢纽等场景。 方案亮点 ‌接口高密度‌&#xff1a;单板集成5GWiFi多路工业接口&#xff0c;减少扩展复杂度。‌AIoT融合‌&#xff1a;边缘端完成传感器数据聚合与AI推理&#xff0c;降低云端…

CSS基础知识一览

持续维护 选择器 display 常用属性 浮动 弹性布局

【免费】2000-2019年各省地方财政房产税数据

2000-2019年各省地方财政房产税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政房产税 4、范围&#xff1a;31省 5、指标说明&#xff1a;房产税是对个人和单位拥有的房产征收的一种…

车载以太网网络测试-21【传输层-DOIP协议-4】

目录 1 摘要2 DoIP entity status request/response&#xff08;0x4001、0x4002&#xff09;2.1 使用场景2.2 报文结构2.2.1 0x4001&#xff1a;DoIP entity status request2.2.2 0x4002&#xff1a;DoIP entity status response 3 Diagnostic power mode information request/…

Spring AI Alibaba ChatModel使用

一、对话模型&#xff08;Chat Model&#xff09;简介 1、对话模型&#xff08;Chat Model&#xff09; 对话模型&#xff08;Chat Model&#xff09;接收一系列消息&#xff08;Message&#xff09;作为输入&#xff0c;与模型 LLM 服务进行交互&#xff0c;并接收返回的聊天…

基于FPGA频率、幅度、相位可调的任意函数发生器(DDS)实现

基于FPGA实现频率、幅度、相位可调的DDS 1 摘要 直接数字合成器( DDS ) 是一种通过生成数字形式的时变信号并进行数模转换来产生模拟波形(通常为正弦波)的方法,它通过数字方式直接合成信号,而不是通过模拟信号生成技术。DDS主要被应用于信号生成、通信系统中的本振、函…

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

3DMAX曲线生成器插件CurveGenerator使用方法

1. 脚本功能简介 3DMAX曲线生成器插件CurveGenerator是一个用于 3ds Max 的样条线生成工具&#xff0c;用户可以通过简单的UI界面输入参数&#xff0c;快速生成多条样条线。每条样条线的高度值随机生成&#xff0c;且可以自定义以下参数&#xff1a; 顶点数量&#xff1a;每条…

六十天前端强化训练之第二十六天之Vue Router 动态路由参数大师级详解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、知识讲解 1. Vue Router 核心概念 2. 动态路由参数原理 3. 参数传递方案对比 二、核心代码示例 1. 完整路由配置 2. 参数接收组件 3. 导航操作示例 三、实现效果示…

Model Context Protocol:下一代AI系统集成范式革命

在2023年全球AI工程化报告中,开发者面临的核心痛点排名前三的分别是:模型与业务系统集成复杂度(58%)、上下文管理碎片化(42%)、工具调用标准化缺失(37%)。传统API集成模式在对接大语言模型时暴露明显短板:RESTful接口无法承载动态上下文,GraphQL缺乏工具编排能力,gR…

Java多线程与高并发专题——Future 是什么?

引入 在上一篇Callable 和 Runnable 的不同&#xff1f;的最后&#xff0c;我们有提到和 Callable 配合的有一个 Future 类&#xff0c;通过 Future 可以了解任务执行情况&#xff0c;或者取消任务的执行&#xff0c;还可获取任务执行的结果&#xff0c;这些功能都是 Runnable…

DeepSeek本地搭建

1. 软件下载安装 Miniconda Miniconda下载地址 选择对应的版本下载&#xff0c;此处下载如下版本 Python 3.10 conda 25.1.1 安装完成后&#xff0c;配置环境变量&#xff0c;打开cmd命令窗口验证 Python Python的版本为 3.10 PyTorch PyTorch下载地址 后面通过命令下…

维普AIGC降重方法有哪些?

在学术写作和论文创作中&#xff0c;重复率过高是许多人面临的一大难题。随着科技的发展&#xff0c;维普 AIGC 为我们提供了一系列有效的降重方法。那么&#xff0c;维普AIGC降重方法有哪些呢&#xff1f;接下来就为大家详细介绍。 语义理解与改写 维普 AIGC 具备强大的语义理…

南京审计大学:《 面向工程审计行业的DeepSeek大模型应用指南》.pdf(免费下载)

大家好&#xff0c;我是吾鳴。 今天吾鳴要给大家分享的是由南京审计大学出品的《面向工程审计行业的DeepSeek大模型应用指南》&#xff0c;这份报告与《面向审计行业DeepSeek大模型操作指南》不同&#xff0c;这份报告更多的讲述DeepSeek怎么与工程审计行业结合&#xff0c;应该…

【前端】Canvas画布实现在线的唇膏换色功能

【前端】Canvas画布实现在线的唇膏换色功能 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【前端】Canvas画布实现在线的唇膏换色功能背景概述以下是我们的实现方法!第一步 — 找…

arcgispro加载在线地图

World_Imagery (MapServer)https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer添加arcgis server WMTS 服务 by xdcxdc.at xdc的个人站点。博客请转至 http://i.xdc.at/ http://xdc.at/map/wmts 添加WMTS服务器

华为网路设备学习-16 虚拟路由器冗余协议(VRRP)

VRRP是针对干线上三层网络设备&#xff08;如&#xff1a;路由器、防火墙等&#xff09;的网络虚拟化技术&#xff0c;提供冗余和状态监测等功能。确保在网络中的单点故障发生时&#xff0c;能够快速切换到备份设备&#xff0c;从而保证网络通信的连续性和可靠性。‌ VRRP通过…

封装一个分割线组件

最终样式 Vue2代码 <template><div class"sep-line"><div class"sep-label"><span class"sep-box-text"><slot>{{ title }}</slot> <!-- 默认插槽内容&#xff0c;如果没有传递内容则使用title -->&…