.Net Core 学习笔记(一)

news/2025/2/26 13:06:35/文章来源:https://www.cnblogs.com/tomtang123/p/18738211

.Net Core 中的 async 和 await 的原理

  • async 关键字用于标记异步方法,await 用于异步调用。
  • 底层是基于 Task 和 Task,依赖于 状态机(State Machine),核心是 SynchronizationContext 和 TaskScheduler。
  • await 遇到 Task 时,会先 挂起当前方法,然后继续执行其他任务,待任务完成后再回到原来的执行位置。

第一种写法

static async Task Main(){Console.WriteLine("1");Task<int> task = GetDataAsync();Console.WriteLine("2...");int result = await task;Console.WriteLine($"3. result:{result}");Console.WriteLine("4. end");}static async Task<int> GetDataAsync(){Console.WriteLine("  >> [async] strat");await Task.Delay(10000); Console.WriteLine("  >> [saync] end");return 42;}
}

执行流程

1>> [async] strat  (异步任务开始,但未等待)
2...               (继续执行,不等待异步任务)>> [async] end    (10秒后异步任务完成)
3. result:42       (await 处阻塞,等待异步任务完成)
4. end

关键点

  • GetDataAsync() 在 Task task = GetDataAsync(); 处启动,但不会阻塞 Main 方法。
  • Console.WriteLine("2..."); 不会等待 GetDataAsync() 结束,而是继续执行。
  • await task; 此时才真正等待异步任务完成。

第二种写法

static async Task Main(){Console.WriteLine("1");var result = await GetDataAsync();Console.WriteLine("2...");Console.WriteLine($"3. result:{result}");Console.WriteLine("4. end");}static async Task<int> GetDataAsync(){Console.WriteLine("  >> [async] strat");await Task.Delay(10000); Console.WriteLine("  >> [saync] end");return 42;}
}

执行流程:

1>> [async] strat  (异步任务开始)>> [async] end    (10秒后异步任务完成)
2...               (异步任务结束后,继续执行)
3. result:42
4. end

关键点

  • await GetDataAsync(); 直接等待 GetDataAsync() 结束后才执行后续代码。
  • 代码执行顺序是严格的顺序执行,不会提前执行 Console.WriteLine("2...")。

区别总结

第一种写法 (Task<int> task = GetDataAsync();) 第二种写法 (await GetDataAsync();)
异步任务启动时机 GetDataAsync() 立即启动,但不会阻塞 GetDataAsync() 立即启动,但 await 直接阻塞后续代码
是否可以并行执行代码 可以Console.WriteLine("2..."); 不会等待 不可以,必须等 GetDataAsync() 完成后执行下一行
适合的场景 适用于需要异步任务执行的同时继续其他工作 适用于必须等任务完成后才能继续

await GetDataAsync().ConfigureAwait(false)

  • 这行代码是真正的异步执行,它不会阻塞当前线程,而是允许线程去执行其他任务,直到 GetUtteranceInfo 任务完成。
  • await 关键字会等待 GetUtteranceInfo 执行完成并返回结果,但不会阻塞线程。
  • ConfigureAwait(false) 作用是避免恢复到原来的同步上下文,在 ASP.NET 或 UI 应用程序(如 WPF/WinForms)中,这有助于提高性能并减少死锁风险。

何时使用 ConfigureAwait(false)

场景 是否使用 ConfigureAwait(false) 说明
库代码(Class Library, SDK) ✅ 推荐 避免影响调用方的上下文,提高兼容性
ASP.NET Core / MVC / Web API ✅ 推荐 避免上下文切换,提高性能
后台任务(Background Service) ✅ 推荐 不需要回到主线程,减少线程切换
Console 应用(.NET Core) ✅ 推荐 避免死锁
WPF / WinForms UI 操作 🚫 不要使用 需要回到 UI 线程,否则 UI 可能无法更新

简而言之:

后台代码、库代码、ASP.NET 后端 → ConfigureAwait(false)
UI 操作不要用 ConfigureAwait(false),必要时手动切回 UI 线程

示例(WPF/WinForms UI 操作 - 不要用 ConfigureAwait(false))

public async Task LoadData()
{var data = await FetchDataAsync().ConfigureAwait(false); // ❌ UI 线程丢失myLabel.Text = data; // ⚠️ 这里会抛出异常,因为 UI 线程已丢失
}

正确做法

public async Task LoadData()
{var data = await FetchDataAsync().ConfigureAwait(false); await Dispatcher.InvokeAsync(() => myLabel.Text = data); // ✅ 切回 UI 线程
}

GetDataAsync().GetAwaiter().GetResult()

  • 非异步方法中使用。
  • 这行代码会阻塞当前线程,直到 GetUtteranceInfo 任务完成,并返回结果。
  • GetAwaiter().GetResult() 是 Task 的一种同步等待方式,它会获取 Task 的结果,但如果 Task 抛出异常,它会将异常直接传播,而不会进行 AggregateException 封装。
  • 可能会导致死锁:如果当前代码运行在同步上下文(如 ASP.NET 的 UI 线程),调用 GetResult() 可能会阻塞线程并导致死锁。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图吧工具箱PC电脑工具(图拉丁吧硬件检测工具箱) v2025.01 中文绿色便携版

点击上方蓝字关注我 前言 图吧工具箱(大家通常叫它图拉丁吧硬件检测工具箱)是一个完全免费、开源、没有广告的硬件检测工具集合。这个工具箱是专门为喜欢自己动手组装电脑(DIY)的朋友们,特别是图钉社区的成员们制作的。里面包含了好多常用的硬件测试和检测小工具,特别适合…

在Windows上安装UOS打印机

因自己放在办公室发挥余热的Windows电脑即将寿终正寝,所以这两天试着将包括文件打印在内的基础网络服务逐渐转移到UOS主机上。 参照官方教程一通操作,Windows始终在添加打印机页面找不到同个局域网下的UOS主机,点击疑难解答则提示“该设备或资源未设置为接受端口“文件和打印…

是不是长大之后便很难再专注了?

写在前面 1100 字 | 专注 | 思考 | 逆向思维 正文“上课要专心。”我们似乎总能听见大人们这样要求我们。不过坦白地说,我真正体验过全神贯注的时刻,就那么一两次。看起来这篇文章,似乎又要大吐苦水,谈论生活怎样艰辛困苦,各种科技产品怎样将人碎片化之类。并不是。 恰恰相…

2025牛客寒假算法基础集训营3补题笔记

比赛链接 题目难度顺序大致为:\(A、M、F、L、C、\) \(easy\):\(A、M、F、L、C\) 太难了这场。。。E题卡了3个多小时。。。 A.智乃的博弈游戏 题意 有\(n\) 个石头,两人轮流取石头。每次能取小于石头个数且与石头个数互质的数量,当某人取时只有一颗石头则获胜。问先手是否可…

HTTPS 与 HTTP 的区别在哪?

HTTP与HTTPS作为互联网数据传输的核心协议,其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验。它们有什么不同?HTTPS到底安全在哪里?HTTP与HTTPS作为互联网数据传输的核心协议,其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验。本文将解析两者…

Featurewiz-Polars:一种强大且可扩展的特征选择解决方案,适用于XGBoost

前言:“Featurewiz-Polars”是一个用于特征工程的 Python 库,结合了特征选择和特征生成的功能。它基于“Polars”,这是一个高性能的 DataFrame 库,用于处理大型数据集,具有类似 Pandas 的 API 但更高效,尤其在处理大数据时。Featurewiz-Polars 专注于通过自动化方式,快速…

USACO2025FEB Gold T1 T2 题解

T3 等会补USACO2025FEB Gold 题解 赛时先看 T1,感觉很可做,推了一下发现能把问题转成在基环树上 dp。但我一下子没太想明白怎么解决“在基环树上找环”这个世纪难题,大概在一个小时 20 分钟的时候写完代码(值得一提的是这次罕见地一次就过了编译),交上去发现 WA 了大约一…

Windows10/Windows11系统快速安装杜比音效经典版教程指南

点击上方蓝字关注我 前言 在当今的数字娱乐时代,音频质量已经成为我们追求的重要部分。杜比音效,凭借其卓越的音质和沉浸式的听觉体验,成为了众多音频爱好者的首选,安装杜比音效经典版,提升电脑音频体验。无论是对于追求极致音质的音乐发烧友,还是渴望在观影和游戏时获得…

No.12 HTML5--新增标签

一、HTML5和HTMLHTML5是 HTML 最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定。 在 HTML5出现之前,我们一般采用 DIV+CSS 布局我们的页面。但是这样的布局方式不仅使我们的文档结构不够清浙,而且不利于搜索引擎爬虫对我们页面的爬取。为了解决上述缺点,HTML5新增…

ICLR 2025 | 无需训练的Token级 DiT加速方法

前言 本文分享 ICLR 2025 论文 ToCa: Accelerating Diffusion Transformers with Token-wise Feature Caching,提出的 ToCa 模型通过 token 粒度的缓存方法,实现了图像和视频生成模型上无需训练的两倍以上的加速。 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最…

Ⅱ.数据的机器级表示

章节导论: 2.1 位和数据类型 2.1.1 信息最小单位-位(0和1)(如高电压(0.9-1.1v)和低电压(0.0-0.2v)) 2.1.2 数据类型 2.2 整数 2.2.1 无符号整数 位置计数法:通过各个位置的数字不同的权重来表示一个数字 如286=2*102+8*101+6 ,在这个十进制系统中基数为10,同理,二进…

生产CPU打满问题排查

运行好好的系统,突然Prometheus告警,CUP使用率95%告警。赶紧排查一下。 一、先用top -H 命令查看占用CUP高的是哪个进程,看到PID:32518 的进程占用cup过高 二、用top -Hp 32518看看占用资源最多的线程 三、用jstack 32518 > 32518.jstack.log 命令把线程堆栈打印出来四、使…