type
status
date
slug
summary
tags
category
icon
password
Property
Sep 20, 2023 03:16 AM

编写异步函数

对于任何异步函数,你可以使用Task替代void作为返回类型,让改方法称为更有效的异步(可以进行await)
并不需要在方法体重显式的返回task.编译器会生成一个Task(当方法完成或发生异常时),这使得创建异步的带哦用链非常方便
编译器会对返回Task 的异步函数进行扩展,使其成为当发送信号或发生故障时用TaskCompletionSource来创建Task的代码
因此,当返回Task 的异步方法结束的时候,执行就跳回到怼他进行await的地方。(通过continuation)

在富客户端场景下

富客户端场景下,执行在此刻会跳回到UI线程(如果目前不再UI线程的话)
否则,就在continuation返回在任意线程上继续执行
这意味着,在异步调回图中向上冒泡的时候,不会发生延迟成本,除非是UI线程的第一次“反弹”

返回Task<TResult>

如果方法体返回TResult,name异步方法就可以返回Task<TResult>
其原理就是给TaskCompletionSource发送的信号带有值,而不是null
与同步编程很相似,是故意这样设计的

C#中如何设计异步函数

以同步的方式编写方法
使用异步调用来代替同步调用,并且进行await
除了顶层方法外(UI控件的event handler),把你方法的返回类型升级为Task或Task<Tresult>,这样他们就可以进行await了

编译器能对异步函数生成Task意味着什么

大多数情况下,你只需要在初始化IO-bound并发底层方法里显式的初始化TaskCompletionSource,这种情况很少见。
针对初始化computed-bound的并发方法,你可以使用Task.Run来创建Task

异步调用图的执行

整个执行与之前同步例子中调用图的顺序一样,因为我们对每个异步函数的调用都进行了await
在调用图中创建了一个没有并行和重叠的连续流
每个awaitAI执行中都创建了一个间隙,在间隙后,程序可以从中断处恢复执行

并行(Parallelism)

不使用await来调用异步函数会导致并行执行的发生
比如:button.Click+=()⇒Go()
Go 是个async函数
确实满足保持UI响应的并发要求
同样,可以并行跑两个操作

异步lambda表达式

匿名方法(包括Lambda表达式),通过使用Async也可以变成异步方法
附加使用event handler的时候也可以使用异步Lambda表达式
notion image
notion image
notion image
 
C#异步编程-19 awaitC#异步编程-10 Synchronization Context
  • Waline
Kitety
Kitety
独特为佳
公告
我曾经七次鄙视自己的灵魂
--卡里·纪伯伦
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
 
最新评论
Loading...