前面一篇文章我們介紹了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並行異步,注意async與await關鍵字,在.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。