|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。async/task/await三组合是.NETFramework4.5带给.NET开辟者的年夜礼,公道地利用它,能够进步使用程序的吞吐才能。
可是它的利用有点绕人,假如不准确利用,会带来意想不到的成绩——好比await以后一向在守候,比及花儿也谢了,也等不来。
这篇博文将向你展现我们在实践开辟中碰到的这个成绩。
先看一段ASP.NETMVC示例代码:
- publicclassBlogController:Controller{publicasyncTask<ActionResult>AwaitDemo(){varresponseHtml=GetResponseHtml("http://www.ckuyun.com/");returnContent(responseHtml);}privatestringGetResponseHtml(stringurl){returnGetResponseContentAsync(url).Result;}privateasyncTask<string>GetResponseContentAsync(stringurl){varhttpClient=newSystem.Net.Http.HttpClient();varresponse=awaithttpClient.GetAsync(url);if(response.StatusCode==System.Net.HttpStatusCode.OK){returnawaitresponse.Content.ReadAsStringAsync();}else{return"error";}}}
复制代码
代码申明:
- 在下面的代码中,固然在Action办法之前加了asyncTask<ActionResult>,但因为在办法体中没有利用await,以是实践仍是以同步的体例实行的,与间接利用ActionResult是一样的。
- GetResponseHtml是同步办法,GetResponseContentAsync是异步办法,在GetResponseHtml中挪用了异步的GetResponseContentAsync。(假如挪用的是第三方程序集,我们就不晓得在GetResponseHtml中举行了异步伐用,以是这个办法的计划是有成绩的)
这段代码实行了局会是如何呢?
——了局就是没有了局,一向在实行。。。
(注:假如在把持台使用程序中挪用一样的GetResponseHtml,不会呈现这个成绩)
那假如办理这个成绩呢:
办理办法一:在MVCAction中开启一个Task举行await
- publicasyncTask<ActionResult>AwaitDemo(){varresponseHtml=awaitTask.Factory.StartNew(()=>GetResponseHtml("http://www.ckuyun.com/"));returnContent(responseHtml);}
复制代码
办理办法二:将GetResponseHtml酿成异步办法
- publicasyncTask<ActionResult>AwaitDemo(){varresponseHtml=awaitGetResponseHtml("http://www.ckuyun.com/");returnContent(responseHtml);}privateasyncTask<string>GetResponseHtml(stringurl){returnawaitGetResponseContentAsync(url);}
复制代码
明显,第2个办理办法是更好的。
以是,我们在计划一个办法(method)时,假如挪用了async办法,必定要将这个办法自己计划为async的。否则,他人挪用时很简单踩着这个坑,然后就一向等啊等。。。比及花儿谢了,电脑冒烟了,也等不到。
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。 |
|