如何将.net 4.5 Async / Await示例转换回4.0
等效的asp.net mvc 4.0代码是什么样的?
using System.Net; using System.Net.Http; using System.Web.Mvc; using System.Threading.Tasks; using Newtonsoft.Json; namespace Web.Controllers { public class HomeController : Controller { private HttpClient httpClient = new HttpClient(); private static dynamic shots; public async Task Index() { if (shots == null) { try { var responseMessage = await httpClient.GetAsync ("http://api.dribbble.com/shots/everyone?per_page=30"); responseMessage.EnsureSuccessStatusCode(); var value = await responseMessage.Content.ReadAsStringAsync(); shots = await JsonConvert.DeserializeObjectAsync(value); } catch (WebException) { } } return View(shots); } } }
注意:这仅适用于Async / Await部分。
最简单的方法是使用Async CTP 。 它有一个Go live许可证,这意味着您可以在生产代码中使用它。 在Async CTP不提供异步等效的情况下,您必须进行一些修改。
您可以在Azure上使用Async CTP,因为唯一需要的是额外的DLL。 这里有类似的SO问题Async CTP和Windows Azure支持
我已经在生产中使用Async CTP超过一年没有问题。 我肯定会推荐这个。 升级到.NET 4.5非常简单,基本上只需要更改一些类名(TaskEx to Task)和一些签名更改。
如果您可以使用Visual Studio 2012 RC,您还可以使用Async Targeting包 ,它允许您使用.NET 4中的异步代码,其更改次数比使用Async CTP时少。
最后,powershell解决方案是使用ParallelExtensionsExtras示例中的TaskIterator来模拟async / await的作用。 您必须将所有异步调用转换为任务或返回任务的方法,然后迭代这些任务的列表。 它是更多的代码,但它是唯一的解决方案,如果你不想使用CTP代码,即使它有一个Go Live许可证。
ParallelExtensionsExtras包含WebClient的异步任务,如果您决定从HttpClient切换到WebClient ,这可能很有用。
正如有人正在探索如何在.NET 4.0中完成所有这些工作,我还没有在这个线程上找到给定的答案,而其他人已经足够完成以立即启动并运行。 所以以下是一个更全面的答案:
=======步骤#1)安装Microsoft ASP.NET Web API客户端库(RC)4.0.20505.0 =======
http://nuget.org/packages/Microsoft.AspNet.WebApi.Client
PM> Install-Package Microsoft.AspNet.WebApi.Client
安装:System.Net.Http.dll,System.Net.Http.Formatting.dll,System.Net.Http.WebRequest.dll,Newtonsoft.Json.dll
=======步骤#2)Microsoft .NET Framework 4 HTTP客户端库2.0.20505.0 =======
http://nuget.org/packages/Microsoft.Net.Http 。
PM> Install-Package Microsoft.Net.Http.
如果你已经按照步骤#1,NuGet应该已经抓住了这个依赖:System.Net.Http.dll。 System.Net.Http。 提供HttpClient,HttpRequestMessage和HttpResponseMessage。
此时,使用async / await时会出现错误(尽管这些关键字仍然显示为关键字),例如:
找不到’async’修饰符所需的所有类型。 您是否针对错误的框架版本,或缺少对程序集的引用?
从而:
=======步骤#3)Visual Studio的异步定位包=======
http://www.microsoft.com/en-us/download/details.aspx?id=29576
PM> Install-Package Microsoft.CompilerServices.AsyncTargetingPack
(’… Visual Studio 11’名称需要在NuGet上更新,两者都是1.0.0版)
安装1 dll:Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll
“Visual Studio 2012的异步定位包”使面向.NET Framework 4.0或Silverlight 5的项目能够使用C#5中的异步语言function…“ http://www.microsoft.com/en-us/download/ details.aspx?ID = 29576
除此之外,还添加了TaskEx(一个.NET 4.0版本,它填充了许多新的Taskfunction.TaskEx仅适用于4.0版本……所以.NET 4.5:“Task.Run”在4.0中:“TaskEx.Run”,这个库有很多其他东西都是这样的)
突然间,等待和异步,整个作品开始像魅力一样! 如果你反思,关于这个的最重要的事情之一是类(声明没有命名空间):AsyncCompatLibExtensions。 包含扩展方法的静态类,特别是:1)Stream。 例如ReadAsync。 所以现在stream.ReadAsync突然出现了! (它实际上干净地包装流的BeginRead / BeginWrite,如果你想知道),2)WebClient。 例如webClient.DownloadStringTaskAsync等等。
警告没有错误检查!
好吧,我觉得我今天学到了一些东西,请阅读这篇文章http://blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx,以了解更好的方法来处理这个:)
using System.Net.Http; using System.Threading.Tasks; using System.Web.Mvc; using Newtonsoft.Json; namespace DribbbleR.Web.Controllers { public class HomeController : Controller { private static dynamic shots; private HttpClient client = new HttpClient(); private string url = "http://api.dribbble.com/shots/everyone?per_page=30"; public Task Index() { if (shots == null) shots = Task.Factory.StartNew (() => return DownloadContent();).Unwrap(); return shots; } public Task DownloadContent() { var responseTask = client.GetAsync(url); var readTask = responseTask.ContinueWith (t => { t.Result.EnsureSuccessStatusCode(); return t.Result.Content.ReadAsStringAsync(); } ).Unwrap(); var deserializeTask = readTask.ContinueWith (t => return JsonConvert.DeserializeObjectAsync (t.Result);) .Unwrap(); var viewTask = deserializeTask.ContinueWith (t => return this.View(t.Result);); return viewTask; } } }
您可以使用Visual Studio 2012的Async Targeting Pack http://www.microsoft.com/en-us/download/details.aspx?id=29576
我不知道你是否找到了这个问题的答案,但我看看这个链接:
- Async Targeting Pack的更新