async/task/await三組合是.NET Framework 4.5帶給.NET開發者的大禮,合理地使用它,能夠提升應用程序的吞吐能力。異步
可是它的使用有點繞人,若是不正確使用,會帶來意想不到的問題——好比await以後一直在等待,等到花兒也謝了,也等不來。async
這篇博文將向你展現咱們在實際開發中遇到的這個問題。url
先看一段ASP.NET MVC示例代碼:spa
public class BlogController : Controller { public async Task<ActionResult> AwaitDemo() { var responseHtml = GetResponseHtml("http://www.cnblogs.com/"); return Content(responseHtml); } private string GetResponseHtml(string url) { return GetResponseContentAsync(url).Result; } private async Task<string> GetResponseContentAsync(string url) { var httpClient = new System.Net.Http.HttpClient(); var response = await httpClient.GetAsync(url); if (response.StatusCode == System.Net.HttpStatusCode.OK) { return await response.Content.ReadAsStringAsync(); } else { return "error"; } } }
代碼說明:設計
這段代碼執行結果會是怎樣呢?code
——結果就是沒有結果,一直在執行。。。blog
(注:若是在控制檯應用程序中調用一樣的GetResponseHtml,不會出現這個問題)開發
那若是解決這個問題呢:同步
解決方法一:在MVC Action中開啓一個Task進行awaitstring
public async Task<ActionResult> AwaitDemo() { var responseHtml = await Task.Factory.StartNew(() => GetResponseHtml("http://www.cnblogs.com/")); return Content(responseHtml); }
解決方法二:將GetResponseHtml變成異步方法
public async Task<ActionResult> AwaitDemo() { var responseHtml = await GetResponseHtml("http://www.cnblogs.com/"); return Content(responseHtml); } private async Task<string> GetResponseHtml(string url) { return await GetResponseContentAsync(url); }
顯然,第2個解決方法是更好的。
因此,咱們在設計一個方法(method)時,若是調用了async方法,必定要將這個方法自己設計爲async的。否則,別人調用時很容易踩着這個坑,而後就一直等啊等。。。等到花兒謝了,電腦冒煙了,也等不到。