原文地址: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;
}
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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- mathgl
- 等级: 初级会员
- 性别:
- 文章: 1102
- 积分: 50
- 来自: HK
|
这个东西类似
py twisted的 yield 的用法,能把一些
需要写一连串callbacks的 代码变为 类似传统blocking的风格,
比较易读而且容易维护。是很不错的。
|
返回顶楼 |
|
|
论坛首页 →
编程语言技术版
跳转论坛:
Global site tag (gtag.js) - Google Analytics