网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > ASP.net > 正文

从ASP.NET MVC 2到4看异步控制器

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/05

这篇文章主要针对即将到来的ASP.NET MVC4中的异步控制器做一个回顾和展望, 并未涉及到讨论异步控制器的使用场合, 如果对异步控制器何时使用仍然纠结的同学, 这次可能会让你们失望了, 不过关于这方面的讨论和分析其实蛮多的, 大家也可以自行搜索.好了,废话少说,上正文.

异步控制器

在MS越来越提倡异步操作的时代, ASP.NET MVC中的异步操作却一直显得比较落伍, 对于开发人员来说, 实现一个异步控制器往往要比普通的控制器花费更多的代码. 这个特性是在ASP.NET MVC 2中被引入的, 之后就没怎么改过,直到现在, 随着C# 5和 async/await的即将到来, 异步控制器现在已经跟普通的控制器操作代码一样的简练啦. 现在(当然得等ASP.NET MVC4,.NET 4.5和C# 5正式的发布之后), 你可以写出下面这样简洁的代码啦:

  1. publicasync Task<ViewResult> FooBar() {  
  2. returnView(await DoSomething("Some Action"));} 

怎样? 真的是很简单的吧~~

展望固然重要, 不过在这之前, 也请大家随着我来回顾下一步控制器在ASP.NET MVC 2到4中的实现, 对比往往更能让人印象深刻.

注意:下面关于ASP.NET MVC 4的例子都是基于ASP.NET MVC Developer Preview. 在正式版中, 这种实现可能会有所变化.

在ASP.NET MVC 2/3中的异步控制器

在ASP.NET MVC 2/3 中, 要实现一个一步控制器,你将不得不实现两个方法, 一个叫XXXAsync, 另外一个叫XXXCompleted, 同时你的控制器还要改成继承自AsyncController, 关于这个的实现和讲解已经有很多现成的例子, 这里我就直接从MSDN上搬过来一个例子吧.

要看异步控制器, 我们首先看看同样功能的同步实现, 大家应该都很熟悉了:

  1. publicclassPortalController: Controller{publicActionResult News(stringcity){  
  2. NewsService newsService = newNewsService();  
  3. ViewStringModel headlines = newsService.GetHeadlines(city);  
  4. returnView(headlines);}  

我们再来看其异步实现方式:

  1. publicclassPortalController : AsyncController{  
  2. publicvoidNewsAsync(stringcity){  
  3. AsyncManager.OutstandingOperations.Increment();  
  4. var newsService = newNewsService();  
  5. newsService.GetHeadlinesCompleted += (sender, e) =>{AsyncManager.Parameters["headlines"] = e.Value;AsyncManager.OutstandingOperations.Decrement();};  
  6. newsService.GetHeadlinesAsync(city);  
  7. }  
  8. publicActionResult NewsCompleted(string[] headlines){  
  9. returnView("News", newViewStringModel{NewsHeadlines = headlines});}  
  10. }  

看看上面的实现, 不得不承认, 相对同步控制器, 异步Action开发人员要做的工作还是要多一些的. 但在.NET4.0的大环境中, 我们也只能用这种方式来实现了.

当然, MSDN的例子是标准的分层的实现例子, 在这个例子中,你将不得不实现自己的Service层, 如果你只是想简单的调用异步Action, 有没有方便的办法呢? 答案是有的, 在.NET 4.0中,微软带来了Task类, 感兴趣的同学可以猛击这里. 有了Task,如果你只是想简单的一个函数里面做异步操作也是可以滴:

  1. publicclassPortalController : AsyncController {publicvoidNewsAsync(stringcity)
  2. {AsyncManager.OutstandingOperations.Increment();  
  3. var task = Task.Factory.StartNew(() => RunThread(city));  
  4. task.ContinueWith(t =>{AsyncManager.Parameters["headlines"] = t.Result;  
  5. AsyncManager.OutstandingOperations.Decrement();})  
  6. ;}  
  7. publicActionResult NewsCompleted(string[] headlines){  
  8. returnView("News", newViewStringModel{NewsHeadlines = headlines});}  
  9. privatestringRunThread(stringinput){  
  10. Thread.Sleep(5000);returninput;}} 

网学推荐

免费论文

原创论文

设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号