C#中的异步调用中async及await关键字的调用把异步调用做到了极致,得用这两个关键子,你可以像编写串行程序一样写异步调用程序。
异步调用通常用来处理耗时操作,比如从互联网加下载多媒体文件,在串行程序中联网操作容易导致程序假死,因此通常采用异步来进行这些耗时操作。所谓异步就是,当要进行耗时操作,如下载图片的时候,程序就另外开一个线程,让这个线程去下载图片,一旦下载图片的命令发出后,主线程不等待(即同步)图片下载完就继续执行。这时一个自然的问题就是当新开的线程图片下载完了该怎么办,像JAVA及旧版本的C#的片理就是添加一个回调函数,所谓回调函数就是主线程让新线程去下载图片,同时告诉新线程图片下载完了就要执行这个函数(即回调函数)。这个一个非常自然的过程。然而微软的工程师不这么认为,他们为了C#程序员的美好生活又把回调做成一个await关键子就能搞定的东西。
废话了这么多,来看一个例子:
public async void get()
{
HttpClient c = new HttpClient();
String res = await c.getStringAsync(url);
Console.Write(res);
}
首先,get()函数用async关键子修饰,表明这个函数是一个异步操作,在那里异步呢?
String res = await c.getStringAsync(url);
HttpClient.getStringAsync(url) 异步地执行一个HttpGet操作,其返回一个Task
值得注意的是async关键子单独使用没有什么意义,没有实现异步,只有async配合await关键字一起使用才能真正起来异步的作用。