第十五章 使用async/await进行异步编程
名词解释
调用方法:调用一个异步方法的方法,但是本身是同步的,阻塞的
异步方法:包含一个异步操作,可以被异步调用的方法。
异步操作:一个系统定义或自定义的异步方法。
异步方法和异步操作之间存在一种先有鸡还是先有蛋的问题,可以互相转化。而调用方法终结了这种转换。
边界:Task<TResult>,Task
思考异步编程
异步执行的基础
1.在异步操作开始时,返回一个token,可以用这个token在稍后提供后续操作
2.token表示正在进行的操作,这个操作在返回调用代码前可能已经完成,也可能正在处理
3.token表示的想法:在这个操作完成之前,不能进行下一步
4.token的形式通常为Task或者Task<Result>
5.C# 5异步执行流程
5.1执行某些操作
5.2开始异步操作,并记住返回的token
5.3可能会执行其他操作
5.4等待异步操作完成
5.5执行其他操作
语法和语义
1.async:声明异步方法时使用的修饰符。async在编译后在代码实际上是不存在的,它算是一种特性,帮助我们来生成异步代码
2.await:负责消费异步操作
声明异步方法
public static async Task<int> FooAsync() { }
public async static Task<int> FooAsync() { }
async public Task<int> FooAsync() { }
public async virtual Task<int> FooAsync() { }
异步方法的返回类型
1.void:表示完全没有返回任何信息
2.Task:没有返回值,但是存在返回信息,例如线程执行的情况如何
3.Task<TResult>:表示存在返回值,同样可以探查线程的执行情况
4.一般情况下,都应返回Task,除非是事件的订阅者
5.参数不应该使用out和ref,因为获取这个参数时,并不一定能获取到
可等待模式
1.await约束:
不能再catch,finally,非异步匿名函数,lock语句块或不安全代码找那个使用。保证线程安全
2.一般来说,只能等待一个异步操作。包含:
告知是否已经完成
如未完成可附加后续操作
获取结果,该结果可能无返回值,但至少可以指明成功或失败
await表达式的流
1.await后面有时是方法调用的结果,有时是属性
2.执行异步操作时,遇到需要获取异步操作的结果时,会判断异步操作是否已经结束,如果已经结束,则会使用该结果。如果未结束,则执行后续操作,当异步操作完成时,可以认为,会把结果自动的赋值给调用这个结果的地方。
3.直到遇到第一个await前,都是同步的
4.一个Task<T>就是计算机科学中的future,对未来生成的值或抛出的异常所作出的承诺
5.在等待任务时,任务出错或者取消都将抛出异常
第十六章 C# 5附加特性和结束语
1.foreach中捕获变量会会为每一个变量产生一个新实例,不会像闭包那样,共同引用一个元素。
2.for循环还是遵循闭包
3.调用者信息
CallerFilePath
CallerLinerNumber
CallerMemberName
都只能用于可选参数