今天我们来看一下,同样功能在 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看其中过程。

最新文章

  1. CanvasWebgl项目介绍
  2. 号称21世纪的编辑器Atom
  3. BZOJ4454: C Language Practice
  4. Timer的用法
  5. 修改SELinux设置,使vsftp在enforcing security enhance模式下正常运行
  6. PHP扩展开发(2) - VS2013环境搭建
  7. nginx请求体读取(二)
  8. java中的i++和++i区别
  9. python re 正则匹配 split sub
  10. javascript引擎执行的过程的理解--执行阶段
  11. Exp9 Web安全基础
  12. pandas处理时间序列(2):DatetimeIndex、索引和选择、含有重复索引的时间序列、日期范围与频率和移位、时间区间和区间算术
  13. topcoder srm 570 div1
  14. 安装旧版本的Firefox
  15. 《DSP using MATLAB》Problem 5.36
  16. 死磕nginx系列--nginx 限流配置
  17. python的时间差计算
  18. jmeter 基础功能详解
  19. MSTP多生成树的配置
  20. 【[SHOI2007]善意的投票】

热门文章

  1. response 后刷新页面,点击按钮后,禁用该按钮
  2. shapefile文件
  3. 【postgresql】创建自增SEQUENCE
  4. Objective-C中的数据类型、常量、变量、运算符与表达式
  5. Python的注释
  6. js 获取 input file 文件 附给 image src
  7. 一个有意思的js实例,你会吗??[原创]
  8. 解决position:relative情况下,z-index无效的方法
  9. 2026-Keroro侵略地球
  10. 关于用 MySQL 存储 Emoji