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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM