zoukankan      html  css  js  c++  java
  • Asp.net MVC 4 异步方法

           前面一篇文章我们介绍了Asp.net MVC 3下异步操作。今天我们来看一下,同样功能在 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看其中过程。

    希望对您Web开发有帮助。


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    每天一篇经济学人 2020-09-15 分享在 特朗普的“疫苗政治”:科学与政治之争 | 经济学人
    english notes
    new word
    gilbert strang
    news etc
    对自己的要求
    JDBC添加数据
    题目-1031-字符串反转
    题目-1002-字符串分类统计
    ERROR:格式化hdfs后,datanode只启动了一个
  • 原文地址:https://www.cnblogs.com/wintersun/p/2856541.html
Copyright © 2011-2022 走看看