论坛首页 编程语言技术论坛

async 与 await 在 Web 下的应用

浏览 1933 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-03-06  

原文地址:http://www.dozer.cc/2012/03/async-and-await-in-web-application/

欢迎大家到我的博客中查看,排版会更舒服一点!

 

.net 中的异步

关于 .net 的异步,一篇文章是讲不完的,我这里就贴两篇文章让大家看一下:

《正确使用异步操作》《C#客户端的异步操作》《细说ASP.NET的各种异步操作》

另外,在 .net 4.0 中还推出了新的任务并行库(TPL),也是一种新异步模式:

《任务并行库》

最后,.net 4.5 又推出了全新的 async 和 await 关键字:

《C#与Visual Basic的未来(上)》

《C#与Visual Basic的未来(中)》

《C#与Visual Basic的未来(下)》 

最后,在这几篇文章的基础上,想和大家谈谈 async 和 await 在 Web 下的应用,包括 WebForm 和 MVC

 

async 与 await 的简单介绍

仔细看完老赵的《C#与Visual Basic的未来》大家应该都能明白这两个关键字的作用是什么了。

 

适用条件:只能适用于TPL异步模式

传统的方法返回的就是需要返回的内容,而基于TPL模式的异步,返回的都是 Task<T>,其中的 T 类型就是你需要返回内容的类型。

在 Visual Studio 11 中,只要你调用的某个方法返回的类型是 Task 或者 Task<T>,它就会提示这是一个可等待的方法。

这时候,就可以利用 async 和 await 关键字了。

 

场景:解决基于事件的异步中回调函数嵌套使用中的问题

假设有这样一个场景,一个 C# 应用程序中(WinForm Or WPF)我需要从一个网站上下载一个内容,然后再根据内容里的网址再下载里面的内容。

如果直接利用 WebClient 的 DownloadString 方法,很明显 UI 线程会被阻塞,没人会这么做。

如果只是一次下载,那利用 WebClient 的 DownloadStringAsync 就可以轻松解决了,但是如果是想这样需要两次下载,而且两次下载是有关联的呢?如果是三次四次呢?

我们先来看看用基于事件的异步来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
protected void DownloadAsync()
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += client_DownloadStringCompleted;
    client.DownloadStringAsync(new Uri("http://www.website.com"));
}
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted+=client_DownloadStringCompleted2;
    border-top-left-radius: 0px 0px !important; border-top-right-radius: 0px 0px !important; border-bottom-right-radius: 0px 0px !important; border-bottom-left-radius: 0px 0px !important; background-image: none !important; background-color: initial !important; float: none !important; height: auto !important; line-height: 2em !important; text-align: left !important; vertical-align: baseline !important; width: auto
   发表时间:2012-03-08  
这个东西类似

py twisted的 yield 的用法,能把一些

需要写一连串callbacks的 代码变为 类似传统blocking的风格,

比较易读而且容易维护。是很不错的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics