# AsyncAwaitDemo **Repository Path**: s0611163/AsyncAwaitDemo ## Basic Information - **Project Name**: AsyncAwaitDemo - **Description**: C# 同步 异步 回调 状态机 async await Demo;演示不使用async await语法糖,通过状态机实现异步。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 5 - **Created**: 2022-01-15 - **Last Updated**: 2024-09-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C# 同步 异步 回调 状态机 async await Demo 主要演示了不使用async、await语法糖,通过回调函数和状态机实现异步 ## 为什么要写这个Demo? 为了帮助理解异步,async、await经过编译生成的状态机代码,有点复杂,这个Demo里写了一个相对简单的状态机代码,便于理解 ## 代码说明 代码中主要写了三种下载文件的示例 1. 同步方式下载文件,为了防止下载较大文件时卡住界面,代码在线程中执行,文件下载完成之前,始终占用一个线程 2. 异步方式下载文件,使用了async、await语法糖,下载文件时,可以看到,workerThreads(可用线程数)和completionPortThreads(可用异步线程数)会发生变化,但是不会长时间占用一个线程 3. 异步方式下载文件,不使用async、await语法糖,通过回调函数和状态机实现,workerThreads(可用线程数)和completionPortThreads(可用异步线程数)会发生变化,但是不会长时间占用一个线程 ## 结论 1. 相比同步方式,使用异步方式下载文件时,忽略掉误差,下载速度并没有更快,异步的主要优点是不会长时间占用一个线程 2. 在没有async、await语法糖时,使用回调函数和状态机也可以实现异步,但代码写的不够优雅,心智负担重,所以async、await的另一个优点是使代码简单 3. 异步的本质就是回调,C#异步底层是通过系统级回调和状态机实现的,async、await会被编译成状态机代码,相当于用代码生成器生成了代码,但这个代码自己写的话,心智负担重 4. 不使用async、await语法糖的前提下,使用状态机可以避免回调地狱 5. 即使不使用async、await语法糖,依然感受到了异步的侵入性,没办法在底层完全封装起来,代码一直侵入到控件的事件里,使用async、await也是,你从代码的底层,写async一直写到控件的事件层