14

等效的 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);
        }
    }
}
4

4 回答 4

9

注意:这仅适用于 Async/Await 部分。

最简单的方法是使用Async CTP。它具有 Go live 许可证,这意味着您可以在生产代码中使用它。在异步 CTP 不提供异步等效项的情况下,您必须进行一些修改。

您可以在 Azure 上使用 Async CTP,因为唯一需要的是一个额外的 DLL。这里有一个类似的 SO question Async CTP and Windows Azure Support

我已经在生产中使用 Async CTP 一年多了,没有出现任何问题。我肯定会推荐这个。升级到 .NET 4.5 相当容易,本质上只需要更改一些类名(TaskEx 到 Task)和一些签名更改。

如果您可以使用 Visual Studio 2012 RC,您还可以使用Async Targeting 包,它允许您在 .NET 4 中使用您的异步代码,并且比使用 Async CTP 的更改更少。

最后,蛮力解决方案是使用 ParallelExtensionsExtras 示例中的TaskIterator来模拟 async/await 的作用。您必须将所有异步调用转换为任务或返回任务的方法,然后遍历这些任务的列表。它的代码要多得多,但如果您不想使用 CTP 代码,即使它有 Go Live 许可证,它也是唯一的解决方案。

ParallelExtensionsExtras 包括WebClient 的异步任务,如果您决定从 HttpClient 切换到 WebClient,这可能很有用。

于 2012-06-12T10:30:53.983 回答
5

作为探索如何在 .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。系统.Net.Http。是提供 HttpClient、HttpRequestMessage 和 HttpResponseMessage 的。

此时,在使用 async/await 时会出现错误(尽管这些关键字仍然显示为关键字),例如:

找不到“异步”修饰符所需的所有类型。您的目标是错误的框架版本,还是缺少对程序集的引用?

因此:

======= 第 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)WebClient。例如 webClient.DownloadStringTaskAsync 等等。

于 2012-07-27T08:14:27.850 回答
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;
        }
    }
}
于 2012-06-12T12:10:42.220 回答
2

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

于 2012-07-12T12:07:02.130 回答