十年河东,十年河西,莫欺少年穷
学无止境,精益求精
1、简介
从 VS 2012 开始,新引入了一个简化的方法,称为异步编程。我们在 >= .NETFRM 4.5 中和 Windows 运行时中使用异步,因此,我们仅需要进行一小部分编程的工作就可以获得异步编程的所有优点。
对于同步的代码,大家肯定都不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个请求时,如果我们发出请求的代码是同步实现的话,这时候我们的应用程序就会处于等待状态,直到收回一个响应信息为止,然而在这个等待的状态,对于用户不能操作任何的UI界面以及也没有任何的消息,如果我们试图去操作界面时,此时我们就会看到”应用程序为响应”的信息(在应用程序的窗口旁),相信大家在平常使用桌面软件或者访问web的时候,肯定都遇到过这样类似的情况的,对于这个,大家肯定会觉得看上去非常不舒服。引起这个原因正是因为代码的实现是同步实现的,所以在没有得到一个响应消息之前,界面就成了一个”卡死”状态了,所以这对于用户来说肯定是不可接受的
2、优势
异步编程最大的优势其实就是提供系统执行效率,毕竟一个串行执行的程序不如并行来的快。譬如:一个人要干十件事情不如十个人各干一件事情效率高。
3、关键字
通过使用这两个关键字,我们就可以在 .NET 轻松创建异步方法。
4、返回值类型
4.1、Void
如果在触发后,你懒得管,请使用 void。
void返回类型主要用在事件处理程序中,一种称为“fire and forget”(触发并忘记)的活动的方法。除了它之外,我们都应该尽可能是用Task,作为我们异步方法的返回值。
4.2、Task
你如果只是想知道执行的状态,而不需要一个具体的返回结果时,请使用Task。
与void对比呢,Task可以使用await进行等待新线程执行完毕。而void不需要等待。
4.3、Task<TResult>
当你添加async关键字后,需要返回一个将用于后续操作的对象,请使用Task<TResult>。
主要有两种方式获取结果值,一个是使用Result属性,一个是使用await。他们的区别在于:如果你使用的是Result,它带有阻塞性,即在任务完成之前进行访问读取它,当前处于活动状态的线程都会出现阻塞的情形,一直到结果值可用。所以,在绝大多数情况下,除非你有绝对的理由告诉自己,否则都应该使用await,而不是属性Result来读取结果值。
5、范例
再进行范例之前,先写一个错误的异步方法,如下:
public static async Task SyncExec_3() { Proc(); } public static void Proc() { for (int i = 0; i < 1000; i++) { Console.WriteLine(i); } }