如何转换.NET 4.5异步/等待例如回4.0(How do I convert .net 4.5

2019-07-29 20:42发布

将在equivallent 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<ActionResult> 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<dynamic>(value);
                }
                catch (WebException)
                {
                }
            }
            return View(shots);
        }
    }
}

Answer 1:

注意:这是只针对异步/等待部分。

最简单的方法是使用异步CTP 。 它有一个去住许可,这意味着您可以在生产代码中使用它。 你将不得不作出在情况下,异步CTP不提供异步等效一些修改。

您可以在Azure上使用异步CTP作为唯一需要的是一个额外的DLL。 有一个相似的,所以问题在这里异步CTP和Windows Azure支持

我一直在使用异步CTP生产超过一年没有问题。 我肯定会推荐这样做。 升级到.NET 4.5是相当容易的,基本上只需要一些类名称的变化(TaskEx到任务)和几个签名的变化。

如果你可以使用Visual Studio 2012 RC,您还可以使用异步定位包 ,这将让你在.NET 4比如果您使用异步CTP变化较少使用异步代码。

最后,蛮力解决方案是使用TaskIterator从ParallelExtensionsExtras样品效仿异步/等待呢。 你将不得不对所有异步调用转换为任务,或返回任务的方法,然后遍历这些任务列表。 这是一个很多代码,但它是唯一的解决办法,如果你不希望使用CTP的代码,即使它有一个去住许可。

该ParallelExtensionsExtras包括对Web客户端异步任务 ,如果你决定从HttpClient的切换到Web客户端可能是有用的。



Answer 2:

正如有人在探索如何让这一切工作在.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

INSTALLS: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。

在这一点上,你将使用异步时收到错误/伺机(尽管这些关键字仍然显示关键字),说这样的话:

无法找到由“异步”修改所需的所有类型。 你指定了错误的框架版本,或缺少的程序集的引用?

从而:

=======步骤#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个项目......” http://www.microsoft.com/en-us/download/ details.aspx?ID = 29576

除其他事项外,增加了TaskEx(在许多新的任务特点填补了.NET 4.0版本TaskEx只是针对4.0版本...所以.NET 4.5:“Task.Run”是在4.0:“TaskEx.Run”许多其他的事情都是这样使用这个库)

突然,等待和异步,整个工程开始像一个魅力的工作! 如果你反映,关于这个问题的最重要的事情之一是类(没有命名空间中声明):AsyncCompatLibExtensions。 静态包含类扩展方法到尤指:1)流。 例如ReadAsync。 所以,现在stream.ReadAsync突然出现! (它实际上干净包裹流的的BeginRead / BeginWrite,如果你想知道的),2)Web客户端。 如webClient.DownloadStringTaskAsync,等等。



Answer 3:

警告没有错误检查!

嗯,我觉得我今天学到了一些东西,对这篇文章的读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<dynamic> Index()
        {    if (shots == null)
             shots = Task.Factory.StartNew
                   (() => return DownloadContent();).Unwrap();    
             return shots;
        }
        public Task<dynamic> 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<dynamic>(t.Result);)
            .Unwrap();
            var viewTask = deserializeTask.ContinueWith
                  (t =>  return this.View(t.Result););
            return viewTask;
        }
    }
}


Answer 4:

您可以使用异步瞄准包的Visual Studio 2012 http://www.microsoft.com/en-us/download/details.aspx?id=29576



Answer 5:

我不知道你是否找到了这个问题的答案,但是我看看这个链接:

  • 一个更新到异步定位包


文章来源: How do I convert .net 4.5 Async/Await example back to 4.0