2013-10-10 17 views
14

मैं अभी भी async के बारे में बिल्कुल स्पष्ट नहीं हूं और .NET 4.5 में प्रतीक्षा कर रहा हूं। अब तक, मुझे लगता है कि मैं समझता हूं कि प्रतीक्षा करें:एपीकंट्रोलर पोस्ट में Async और Await

  1. फ़ंक्शन (दाईं ओर) को एक अलग थ्रेड पर रखता है।
  2. निष्पादन को वर्तमान फ़ंक्शन के कॉलर
  3. पर वापस रखता है लेकिन प्रतीक्षा (async) फ़ंक्शन समाप्त होने तक शेष फ़ंक्शन का कोड "बंधक" शेष रहता है।

अगर मुझे कुछ गलत समझ रहा है तो कृपया मुझे सही करें। तो, अगर ऊपर से सच है, मैं एक ApiController के पोस्ट समारोह के साथ अटक कि मैं async चाहते हूँ:

[HttpPost] 
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj) 
{   
    myDataContext.MyObjects.InsertOnSubmit(obj); 
    myDataContext.SubmitChanges(); 

    await SomeReallyLongRunningTaskAsync();   

    // obj would now have the new Id, which I'm really after. 
    return Request.CreateResponse(HttpStatusCode.Created, obj); 

} 

तो अगर मैं इस को सही ढंग से समझ रहा हूँ, पोस्ट निष्पादन समाप्त करने और वापस जाने के जो कोई भी myApiController.Post(obj) कहा जाता है करने के लिए नियंत्रण होगा। लेकिन return Request.CreateResponse(HttpStatusCode.Created, obj); "बंधक" होने के बाद से मेरे पास HttpResponseMessage ऑब्जेक्ट नहीं है।

इस उपरोक्त सरल उदाहरण में, क्या कॉल तुरंत ग्राहक (यानी क्लाइंट जेएस वेबसाइट या मोबाइल ऐप) पर वापस आ जाएगा? यदि हां, तो क्या यह 201, 400, 500 (बेहतर नहीं) होगा, अन्य?

उत्तर

13

फ़ंक्शन (दाईं ओर) को एक अलग थ्रेड पर रखता है।

सं। async नया धागा शुरू नहीं करता है। मेरे पास async intro है जो आपको उपयोगी मिल सकता है।

पोस्ट निष्पादन समाप्त कर देगा और जो भी मेरा एपीआई कंट्रोलर.पोस्ट (ओबीजे) कहलाता है उसे वापस कर देगा। लेकिन मेरे पास अभी तक HttpResponseMessage ऑब्जेक्ट नहीं है

सही।

इस उपरोक्त सरल उदाहरण में, क्या कॉल तुरंत ग्राहक (यानी क्लाइंट जेएस वेबसाइट या मोबाइल ऐप) पर वापस आ जाएगा?

सं ASP.NET MVC 4.5 देखता है कि आप Task<HttpResponseMessage> और नहीं HttpResponseMessage लौट रहे हैं, तो आपके Task (अपने asyncPost विधि के अंत में) पूरा हो गया है जब तक यह प्रतिक्रिया नहीं भेज देंगे।

25

स्टीफन के उत्तर के अलावा मुझे कुछ चीजों को इंगित करने की आवश्यकता है।

सबसे पहले, नियंत्रक में async उपयोगकर्ता अनुभव async नहीं बनाता है। उपयोगकर्ता को SomeReallyLongRunningTaskAsync() लेते समय तक प्रतीक्षा करनी होगी। [तो हम async क्यों करते हैं? अगला बिंदु देखें]

इसके अलावा, यदि SomeReallyLongRunningTaskAsync() सीपीयू-बाउंड है, तो आपको इसे एसिंक मोड में कॉल नहीं करना चाहिए। मुख्य कारण एक सर्वर परिदृश्य में Async उपयोग करने के लिए रिहाई CLR धागा वापस पूल करने के लिए है ताकि आईओ समापन पोर्ट (IOCP) बाकी संभाल कर सकते हैं - किया आईओ काम जब तक जो तब वापस चला जाता है धागा पूल। यह की समस्या को रोक देगा थ्रेड भुखमरी जो एएसपी.नेट परिदृश्य में आम है।

IOCPs केवलमें स्थितियों आईओ बाध्य किया जाता है, उदाहरण हैं:

  • से पढ़ने/एक फ़ाइल
  • तक पहुँचने डेटाबेस या
  • के लिए लिख एक बाहरी वेब सेवा या WCF तक पहुँचने सेवा

बहुत सारे संसाधन ऑनलाइन उपलब्ध हैं और विभिन्न एएसपीसी की व्याख्या करते हैं ts। अगर मैं प्लग डाल सकता हूं, Chapter 2 of this book एक उत्कृष्ट संसाधन है जो वेब एपीआई में असिनक की एक समेकित समझ देता है।

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