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的。否则,别人调用时很容易踩着这个坑,而后就一直等啊等。。。等到花儿谢了,电脑冒烟了,也等不到。