type
status
date
slug
summary
tags
category
icon
password
Property
Aug 9, 2024 11:58 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表达式
- 作者:Kitety
- 链接:https://www.kitety.com/article/c-sharp-async-asynchronous-function
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章