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 ライセンスがあるため、本番コードで使用できます。Async CTP が非同期の同等物を提供しない場合は、いくつかの変更を加える必要があります。

必要なのは追加の DLL のみであるため、Azure で Async CTP を使用できます。ここに同様のSOの質問がありますAsync CTP and Windows Azure Support

私は Async CTP を本番環境で 1 年以上問題なく使用しています。私は間違いなくこれをお勧めします。.NET 4.5 へのアップグレードはかなり簡単で、基本的にクラス名の変更 (TaskEx から Task) といくつかの署名の変更のみが必要です。

Visual Studio 2012 RC を使用できる場合は、Async CTP を使用する場合よりも少ない変更で .NET 4 で非同期コードを使用できるようにするAsync Targeting パックも使用できます。

最後に、ブルート フォース ソリューションは、ParallelExtensionsExtras サンプルのTaskIteratorを使用して、async/await の動作をエミュレートすることです。すべての非同期呼び出しをタスク、またはタスクを返すメソッドに変換してから、それらのタスクのリストを反復処理する必要があります。これはより多くのコードですが、CTP コードを使用したくない場合は、Go Live ライセンスがあったとしても、これが唯一の解決策です。

ParallelExtensionsExtras には、HttpClient から WebClient に切り替える場合に役立つ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 を既に取得しているはずです。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

""Async Targeting Pack for Visual Studio 2012" を使用すると、.NET Framework 4.0 または Silverlight 5 をターゲットとするプロジェクトで C# 5 の非同期言語機能を使用できます ... " http://www.microsoft.com/en-us/download/ details.aspx?id=29576

とりわけ、TaskEx (多くの新しい Task 機能を備えた .NET 4.0 バージョン。TaskEx は 4.0 バージョン専用です... したがって、.NET 4.5: "Task.Run" は 4.0: "TaskEx.Run" にあります。このライブラリでは、他の多くのことがこれに似ています)

突然、await と async を実行すると、すべての作業が魔法のように機能し始めます。よく考えてみると、これに関する最も重要なことの 1 つはクラス (名前空間なしで宣言されている) です: 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

Async Targeting Pack for Visual Studio 2012 を使用できますhttp://www.microsoft.com/en-us/download/details.aspx?id=29576

于 2012-07-12T12:07:02.130 に答える