2012-06-12 13 views
14

समतुल्य asp.net mvc 4.0 कोड कैसा दिखता है?मैं कैसे परिवर्तित करूं .नेट 4.5 Async/प्रतीक्षा उदाहरण 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

यह वास्तव में काम करता है? पागलपन! .. इस पागल 4.5 सामान की जांच करनी चाहिए। अगर मैं एसिंक यूई इंटरैक्शन चाहता हूं तो मैं एजेक्स/जेसन का उपयोग करता हूं, अगर मैं क्लाइंट को डेटा वापस करने की आवश्यकता के बिना एसिंक सर्वर काम करना चाहता हूं तो शायद मैं थ्रेड को स्पॉइंग या एक [पृष्ठभूमि कार्यकर्ता] (http://msdn.microsoft .com/en-us/library/cc221403 (v = vs.95) .aspx) – musefan

+1

टास्क समांतर लाइब्रेरी .NET 4 की एक विशेषता है जो बहुत अच्छी तरह से काम करती है। बहुत भारी और अधिक बोझिल पृष्ठभूमि कार्यकर्ता –

उत्तर

9

नोट: यह Async/भाग प्रतीक्षा के लिए ही है।

Async CTP का उपयोग करने का सबसे आसान तरीका होगा। इसमें एक गो लाइव लाइसेंस है जिसका अर्थ है कि आप इसे उत्पादन कोड में उपयोग कर सकते हैं। आपको उन मामलों में कुछ संशोधन करना होगा जहां Async CTP Async समकक्ष प्रदान नहीं करता है।

आप Azure पर Async CTP का उपयोग कर सकते हैं क्योंकि एकमात्र चीज एक अतिरिक्त DLL है। यहां एक समान SO प्रश्न है Async CTP and Windows Azure Support

मैं समस्याओं के बिना एक वर्ष से अधिक उत्पादन में Async CTP का उपयोग कर रहा हूं। मैं निश्चित रूप से इसकी सिफारिश करेंगे। .NET 4.5 में अपग्रेड करना आसान है, अनिवार्य रूप से केवल कुछ वर्ग नाम परिवर्तन (कार्य करने के लिए कार्यक्षेत्र) और कुछ हस्ताक्षर परिवर्तनों की आवश्यकता होती है।

यदि आप विजुअल स्टूडियो 2012 आरसी का उपयोग कर सकते हैं तो आप Async Targeting pack का भी उपयोग कर सकते हैं जो आपको Async CTP का उपयोग करने के बजाय .NET 4 में अपने एसिंक कोड का उपयोग करने की अनुमति देगा।

अंत में, ब्रूट-फोर्स समाधान TaskIterator को समानांतर एक्सटेंशन से नमूने के लिए TaskIterator का उपयोग करना है जो एसिंक/प्रतीक्षा करता है। आपको सभी एसिंक्रोनस इनवोकेशन को कार्यों, या विधियों को वापस करने के तरीकों को परिवर्तित करना होगा, और फिर उन कार्यों की सूची में पुन: सक्रिय करना होगा। यह बहुत अधिक कोड है लेकिन यह एकमात्र समाधान है यदि आप सीटीपी कोड का उपयोग नहीं करना चाहते हैं, भले ही उसके पास गो लाइव लाइसेंस हो।

समांतर एक्सटेंशन एक्सटेंशन में asynchronous tasks for the WebClient शामिल है जो उपयोगी हो सकता है यदि आप HttpClient से WebClient पर स्विच करने का निर्णय लेते हैं।

+0

का उपयोग करने की बिल्कुल आवश्यकता नहीं है HttpClient NuGet पर है और आप इसका उपयोग .NET 4.0 से कर सकते हैं। मैं लक्ष्यीकरण क्यों कर रहा हूं .Net 4.0 इसलिए है क्योंकि AppHarbor और Azure अभी भी .NET 4.0 का उपयोग कर रहे हैं और विंडोज 8 और सर्वर 2012 जारी होने तक अपग्रेड नहीं होंगे। उस टास्कइटरेटर पेज के लिंक के लिए धन्यवाद, मैं इसे देख लूंगा :) – superlogical

+0

आप एज़िन में भी असिन सीटीपी का उपयोग कर सकते हैं क्योंकि आपको केवल एक अतिरिक्त डीएलएल तैनात करना है। –

+0

पीएस ...मैंने वेब क्लाइंट से निपटने के अनगिनत घंटे खो दिए हैं और इसके मुफ्त अपवाद हैं। इच्छा है कि मैं 6 महीने पहले Nuget पर HttpClient के बारे में जानता था ... –

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

आप Async दृश्य स्टूडियो के लिए लक्ष्य निर्धारण पैक का उपयोग कर सकते 2012 http://www.microsoft.com/en-us/download/details.aspx?id=29576

+0

के लिए नहीं, इस बात से विचलित है कि किसी ने इसे नीचे दिया है और साथ ही मेरा जवाब भी दिया है। मैंने इसे वापस बराबर करने के लिए वोट दिया। –

5

किसी के रूप में यह पता लगाने के लिए कि .NET 4.0 में यह सब कैसे काम कर रहा है, मुझे इस धागे पर दिए गए उत्तरों नहीं मिले हैं और अन्य तुरंत उठने और चलाने के लिए पर्याप्त पूर्ण हैं। तो निम्नलिखित क्या करना है इसका एक और व्यापक उत्तर है:

======= चरण # 1) माइक्रोसॉफ्ट एएसपी.नेट वेब एपीआई क्लाइंट लाइब्रेरी (आरसी) 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) माइक्रोसॉफ्ट .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 का उपयोग कर त्रुटियों हो रही होगी/इंतजार है (हालांकि अब भी इन खोजशब्दों कीवर्ड के रूप में दिखाई) की तरह बातें कह:

सभी प्रकार के 'async' संशोधक के लिए आवश्यक नहीं मिल सकी। क्या आप गलत फ्रेमवर्क संस्करण को लक्षित करते हैं, या असेंबली का संदर्भ खो रहे हैं?

इस प्रकार

:

======= कदम # 3) Async दृश्य स्टूडियो ======= के लिए पैक का लक्ष्य निर्धारण

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

PM> Install-Package Microsoft.CompilerServices.AsyncTargetingPack 

('... विजुअल स्टूडियो 11' नाम को NuGet पर अपडेट करने की आवश्यकता है, दोनों संस्करण 1.0.0 हैं)

Insta एलएलएस 1 डीएल: माइक्रोसॉफ्ट.कंपेलर सर्विसेज। एसिंक ट्रायलिंगपैक.Net4.dll

"विजुअल स्टूडियो 2012 के लिए असिंक लक्ष्यीकरण पैक" सीई 5 में असिंक भाषा सुविधा का उपयोग करने के लिए .NET Framework 4.0 या Silverlight 5 को लक्षित करने वाली परियोजनाओं को सक्षम बनाता है ... "http://www.microsoft.com/en-us/download/details.aspx?id=29576

अन्य चीजों के अलावा, टास्कएक्स (एक .NET 4.0 संस्करण जो कई नई कार्य सुविधाओं में भरता है जोड़ता है। टास्कएक्स केवल 4.0 संस्करण के लिए है ... इसलिए .NET 4.5: "टास्क.रुन" 4.0 में है: "टास्कएक्स.रुन", इस लाइब्रेरी के साथ कई अन्य चीजें इस तरह हैं)

अचानक, प्रतीक्षा करें और async और पूरे काम एक आकर्षण की तरह काम करना शुरू कर देता है! यदि आप प्रतिबिंबित करते हैं, तो इसके बारे में सबसे महत्वपूर्ण चीजों में से एक वर्ग (नामस्थान के बिना घोषित) है: AsyncCompatLibExtensions। विस्तारित विधियों वाले एक स्थैतिक वर्ग विशेष रूप से: 1) स्ट्रीम। जैसे ReadAsync। तो अब स्ट्रीम। ReeadAsync अचानक प्रकट होता है! (यदि आप जानना चाहते हैं तो यह वास्तव में साफ-सुथरा स्ट्रीम की शुरुआत/BeginWrite लपेटता है), 2) वेब क्लाइंट। जैसे webClient.DownloadStringTaskAsync, और अधिक।

+0

मुझे विश्वास नहीं है कि किसी ने मुझे इस जानकारी को समुदाय में धैर्यपूर्वक योगदान देने के लिए एक डाउनवोट दिया है। यदि आप एक सच्चे आदमी या महिला हैं, तो इसके साथ टिप्पणी पोस्ट करने के बारे में। आप शायद वही व्यक्ति हैं जिन्होंने उपरोक्त ईआर-वी को वोट दिया, जो मूर्ख है। और बीटीडब्ल्यू, तारीख को नोट करें, 4.5 अभी तक बाहर नहीं था, इसलिए इस उत्तर की संभावना अब खत्म हो सकती है। –

0

मैं अगर आप अभी तक इस प्रश्न का उत्तर मिल गया नहीं जानता, लेकिन मैं इस लिंक की जाँच:

संबंधित मुद्दे