C Sharp(十五)
發佈於 2018-11-30
这一篇,我们讲讲 C# 网络编程中比较重要的概念 —— 异步。
当程序启动时,系统就会在内存创建一个新进程。进程是构成程序的资源的集合,资源包括虚拟地址、文件句柄等。
在进程内部,系统还创建了称为线程的内核对象。也就是说一旦进程创建,系统就会在 Main 方法的第一行语句开始线程执行。
关于线程:
在 C# 5.0 引入了一个非常好的特性 —— async/await。在 JavaScript 和即将到来的 Swift 5.0 中都存在引入了此特性,虽然实现的底层原理并不相同。 这个特性是 .Net 框架的一部分,但是没有嵌入 C# 中。
如果程序调用某个方法,等待其执行所有处理之后才继续执行,我们称这样的方法为同步方法。 相反的,异步方法就是在处理完成之前就返回到调用方法。我们使用 async/await 特性可以很方便的创建异步方法。 该特性有三部分组成:
async 关键字是一个专门给编译器的提示,意思是该函数的实现可能会出现 await 表达式。
异步方法的特点:
需要注意:
我们可能需要在调用方法中同步等待某个任务完成,Task<T> 实例提供了 Wait 方法,来等待某个特殊的 Task 完成。 还可以使用 Task 的静态方法 WaitAll 和 WaitAny 方法同步等待多个任务完成。参数为 Task[]。
我们可以使用 await 和 Task 的静态方法 WhenAll 和 WhenAny 方法异步等待多个任务完成。参数为 List<Task<T>>。
注意: async 和 await 都没有新开线程,新开线程是 Task.Run() 做的事情。如果自己编写异步方法,注意要自己编写 Task.Run()。