今天我们来看一下,同样功能在 Asp.net MVC 4 下的实现,基于.net framework 4.5 下的async支持,让我们的代码更加简单,看下面片断代码名叫Index的Action方法:

        public async Task<ActionResult> IndexAsync()
        {
            var cnblogsTask = GetStringAsync("http://www.cnblogs.com");
            var myblogTask = GetStringAsync("http://www.cnblogs.com/wintersun");
 
            // Asynchronously wait for them all to complete.
            await Task.WhenAll(cnblogsTask, myblogTask);
 
            Operations translations = new Operations() { 
                FirstOperation = cnblogsTask.Result, SecondOperation = myblogTask.Result };
 
            return View(translations);
        }
        private static async Task<string> GetStringAsync(string uri
            , CancellationToken cancelToken = default(CancellationToken))
        {
            using (HttpClient httpClient = new HttpClient())
            {
                var response = await httpClient.GetAsync(uri, cancelToken);
                return (await response.Content.ReadAsStringAsync());
            }
        }

上面的代码我们实现多个Task并行异步,注意asyncawait关键字,在.NET 4.5 与 Visual Studio 2012下可用。你只可以使用await关键字同时标注了async的方法。使用异法的HttpClient来替代WebClient类,await关键字运用到HttpClient的异步方法上。使用Task.WhenAll等待所有任务结束。我们知道TPL中还提供了CancellationToken,MVC框架中也提供了AsyncTimeout特性,看面下面示例代码:

        [AsyncTimeout(100)]
        [HandleError(ExceptionType = typeof(TimeoutException),View = "Error")]
        public async Task<ActionResult> IndexCancleAsync()
        {
            var cancellationToken = new CancellationToken(false);
            var cnblogsTask = GetStringAsync("http://www.cnblogs.com", cancellationToken);
            var myblogTask = GetStringAsync("http://www.cnblogs.com/wintersun", cancellationToken);
 
            await Task.WhenAll(cnblogsTask, myblogTask);
 
            Operations translations = new Operations()
            {
                FirstOperation = cnblogsTask.Result,
                SecondOperation = myblogTask.Result
            };
 
            return View(translations);
        }

我们设置异步超时为100毫秒,并且我们可以传递CancellationToken的参数给具体的Task。 最后把结果返回给View,实际你可以自行Debug看其中过程。

Asp.net MVC 4 异步方法的更多相关文章

  1. .net异步性能测试(包括ASP.NET MVC WebAPI异步方法)

    很久没有写博客了,今年做的产品公司这两天刚刚开了发布会,稍微清闲下来,想想我们做的产品还有没有性能优化空间,于是想到了.Net的异步可以优化性能,但到底能够提升多大的比例呢?恰好有一个朋友正在做各种语 ...

  2. 七天学会ASP.NET MVC (六)——线程问题、异常处理、自定义URL

    本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系列文章 七天学会ASP.NET MVC ...

  3. [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)

    继上一篇文章之后,本文将介绍 Controller 和 Action 的一些较高级特性,包括 Controller Factory.Action Invoker 和异步 Controller 等内容. ...

  4. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  5. Asp.net MVC Comet推送

    一.简介 在Asp.net MVC实现的Comet推送的原理很简单. 服务器端:接收到服务器发送的AJAX请求,服务器端并不返回,而是将其Hold住,待到有东西要通知客户端时,才将这个请求返回. 客户 ...

  6. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  7. ASP.NET MVC必知必会知识点总结(二)

    一.实现Controller的依赖注入: 1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法:(如:InjectCon ...

  8. [译]View components and Inject in ASP.NET MVC 6

    原文:http://www.asp.net/vnext/overview/aspnet-vnext/vc 介绍view components view components (VCs) 类似于part ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...

随机推荐

  1. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  2. Tomcat 搭配 Nginx 还是 Apache 呢?

    Apache .Tomcat.Nginx的区别, 哪个与Tomcat搭配效率高? 一. 定义: 1. Apache Apache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机 ...

  3. 在Hadoop分布式文件系统的索引和搜索

    FROM:http://www.drdobbs.com/parallel/indexing-and-searching-on-a-hadoop-distr/226300241?pgno=3 在今天的信 ...

  4. python学习笔记19(序列的方法)

    序列包含有宝值 表(tuple)和表(list).此外,字符串(string)是一种特殊的定值表,表的元素可以更改,定值表一旦建立,其元素不可更改. 任何的序列都可以引用其中的元素(item). 下面 ...

  5. 你不需要jQuery(三):新AJAX方法fetch()

    XMLHttpRequest来完成ajax有些老而过时了. fetch()能让我们完成类似 XMLHttpRequest (XHR) 提供的ajax功能.它们之间的主要区别是,Fetch API 使用 ...

  6. uva 1421

    稍微有点新意的二分 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath ...

  7. 谈谈怎么实现Oracle数据库分区表

    谈谈怎么实现Oracle数据库分区表 数据库的读写分离 SQLSERVER性能监控级别步骤 Oracle索引问题诊断与优化(1)

  8. TaskTracker获取并执行map或reduce任务的过程(一)

    我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求.JobTracker返回给TaskTracker的心跳包中包含有各种a ...

  9. 1964-NP

    描述 Problems in Computer Science are often classified as belonging to a certain class of problems (e. ...

  10. html10个特效(转载)

    http://www.html5tricks.com/10-html5-jquery-image-animatin.html 现在网页上的图片已经不再是10几年前那种低像素的静态图片了,有了HTML5 ...