2012-06-12 10 views
14

Jak wyglądałby kod equVall mVc 4.0?Jak przekonwertować przykład 4.5. Async/Await do wersji 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); 
     } 
    } 
} 
+0

to naprawdę działa? szaleństwo! ..zobacz to szalone 4.5 rzeczy. Jeśli chcę mieć asynchroniczną interakcję z ui używam ajax/json, jeśli chcę aby serwer asynchroniczny działał bez potrzeby zwracania danych do klienta prawdopodobnie patrzyłbym na spawnowanie wątku lub używanie [background worker] (http://msdn.microsoft .com/en-us/library/cc221403 (v = vs.95) .aspx) – musefan

+1

Zadanie Biblioteka równoległa to funkcja platformy .NET 4, która działa bardzo dobrze. Nie ma absolutnie żadnej potrzeby używania znacznie cięższego i bardziej uciążliwego robota tła –

Odpowiedz

9

UWAGA: To jest tylko dla asynchroniczny/Czekają część.

Najprostszym sposobem byłoby użycie Async CTP. Posiada licencję Go na żywo, co oznacza, że ​​można z niej korzystać w kodzie produkcyjnym. Będziesz musiał wprowadzić pewne modyfikacje w przypadkach, w których Async CTP nie zapewnia asynchronicznych odpowiedników.

Możesz używać Async CTP na Azure, ponieważ wymagana jest tylko dodatkowa biblioteka DLL. Istnieje podobne pytanie dotyczące SO tutaj Async CTP and Windows Azure Support

Używam Async CTP w produkcji od ponad roku bez problemów. Zdecydowanie polecam to. Aktualizacja do .NET 4.5 jest dość łatwa, zasadniczo wymaga tylko kilku zmian w nazwie klasy (TaskEx to Task) i kilku zmian sygnatur.

Jeśli możesz użyć Visual Studio 2012 RC, możesz również użyć Async Targeting pack, który pozwoli ci użyć twojego asynchronicznego kodu w .NET 4 z mniejszymi zmianami niż w przypadku używania Async CTP.

Wreszcie, rozwiązaniem typu brute-force jest użycie TaskIterator z przykładów ParallelExtensionsExtras do emulacji tego, co robi async/await. Konieczne będzie przekonwertowanie wszystkich asynchronicznych wywołań na zadania lub metody zwracające zadanie, a następnie powtórzenie listy tych zadań. Jest o wiele więcej kodu, ale jest to jedyne rozwiązanie, jeśli nie chcesz używać kodu CTP, nawet jeśli ma licencję Go Live.

Dodatki ParallelExtensions to asynchronous tasks for the WebClient, które mogą być przydatne, jeśli zdecydujesz się przełączyć z HttpClient na WebClient.

+0

HttpClient działa na NuGet i można go używać z .Net 4.0. Powodem, dla którego celuję w .Net 4.0, jest to, że AppHarbor i Azure nadal używają .Net 4.0 i nie będą uaktualniane, dopóki nie zostaną wydane systemy Windows 8 i Server 2012. Dziękuję za link do strony TaskIterator, którą sprawdzę :) – superlogical

+0

Możesz używać Async CTP nawet na Azure, ponieważ musisz tylko wdrożyć dodatkową bibliotekę DLL. –

+0

PS ...Straciłem niezliczone godziny w związku z WebClientem i jego nieuzasadnionymi wyjątkami. Chciałbym wiedzieć o HttpClient na Nuget 6 miesięcy temu ... –

3

OSTRZEŻENIE Nie ma sprawdzania błędów!

Dobrze czuję, że nauczyłem się czegoś dzisiaj, mają czytać tego artykułu http://blogs.msdn.com/b/pfxteam/archive/2010/11/21/10094564.aspx nauczyć lepszy sposób obsłużyć to :)

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; 
     } 
    } 
} 
5

Jako, że ktoś odkrywa, jak uzyskać to wszystko działa również w .NET 4.0, nie znalazłem odpowiedzi w tym wątku, a inne na tyle, aby od razu zacząć działać. Poniżej znajduje się bardziej wyczerpująca odpowiedź na pytanie, co należy zrobić:

======= KROK # 1) ZAINSTALUJ biblioteki klientów 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 

INSTALACJE: System.Net.Http.dll, System.Net.Http.Formatting.dll, System.Net.Http.WebRequest.dll, Newtonsoft.Json.dll

======= KROK # 2) Microsoft .NET Framework 4 HTTP Client Libraries 2.0.20505.0 =======

http://nuget.org/packages/Microsoft.Net.Http.

PM> Install-Package Microsoft.Net.Http. 

Jeśli wykonałeś już krok nr 1, NuGet powinien był już pobrać tę zależność: System.Net.Http.dll. System.Net.Http. jest tym, co zapewnia HttpClient, HttpRequestMessage i HttpResponseMessage.

W tym momencie, będzie coraz błędy podczas korzystania asynchronicznie/czekać (choć te słowa wciąż pojawiają się jako słowa kluczowe), mówiąc takie rzeczy jak:

Nie można znaleźć wszystkie rodzaje wymaganych przez „asynchroniczny” modyfikatora. Czy jesteś kierowania na niewłaściwą wersję ramy lub brak odniesienia do zespołu ?

Zatem:

======= KROK # 3) asynchroniczny Targeting Pack dla programu Visual Studio =======

http://www.microsoft.com/en-us/download/details.aspx?id=29576

PM> Install-Package Microsoft.CompilerServices.AsyncTargetingPack 

("Nazwa programu Visual Studio 11" wymaga aktualizacji na NuGet, obie są w wersji 1.0.0)

Insta lls 1 dll: Microsoft.CompilerServices.AsyncTargetingPack.Net4.dll

"Async Targeting Pack for Visual Studio 2012" umożliwia projektom targetującym .NET Framework 4.0 lub Silverlight 5 korzystanie z funkcji języka Async w C# 5 ... "http://www.microsoft.com/en-us/download/details.aspx?id=29576

Między innymi dodaje TaskEx (wersja .NET 4.0, która wypełnia wiele nowych funkcji zadań. TaskEx jest tylko dla wersji 4.0 ... więc .NET 4.5: "Task.Run" jest w wersji 4.0: "TaskEx.Run", wiele innych rzeczy jest takich w tej bibliotece)

Nagle czekają i asynchronicznie i całe prace zaczynają działać jak urok! Jeśli się zastanowisz, jedną z najważniejszych rzeczy jest klasa (zadeklarowana bez przestrzeni nazw): AsyncCompatLibExtensions. Klasa statyczna zawierająca metody rozszerzeń, w szczególności: 1) Stream. Na przykład. ReadAsync. Teraz stream.ReadAsync nagle się pojawia! (to faktycznie opakowuje strumień BeginRead/BeginWrite, jeśli chcesz wiedzieć), 2) WebClient. Na przykład. webClient.DownloadStringTaskAsync i więcej.

+0

Nie mogę uwierzyć, że ktoś dał mi zniżkę za cierpliwe przekazywanie tej informacji społeczności. Jeśli jesteś prawdziwym mężczyzną lub kobietą, to możesz opublikować komentarz. Prawdopodobnie jesteś tą samą osobą, która przegłosowała er-v powyżej, co jest bezsensowne. I przy okazji, zanotuj datę, 4,5 jeszcze nie było, więc ta odpowiedź prawdopodobnie zostanie teraz zastąpiona. –

Powiązane problemy