2013-12-16 6 views
5

में असिंक क्रियाएं मेरे पास एक सिंक्रोनस कॉल है जिसे मुझे async में परिवर्तित करने की आवश्यकता है, मैं async/await कुंजी शब्दों का उपयोग कर रहा हूं, लेकिन जब यह कार्य पूरा हो जाता है तो यह केवल लौटाता है जो मुझे करने की ज़रूरत है यूआई को एक करके एक।एएसपी.नेट एमवीसी 4

परिदृश्य यह है कि मेरे पास प्रमाणीकृत होने के बाद उपयोगकर्ता को एक कार्य सूची प्रदर्शित की गई है, हालांकि मैं डीबी से पुनर्प्राप्त होने के बाद एक बार लोड होने के लिए कार्य करना चाहता हूं, यहां मेरी क्रिया है जो एक साथ रखती है खोज मापदंड पूर्व फिल्टर करने के लिए कार्य:

public async Task<ActionResult> Index(string searchTerm = null, int page = 1) 
{ 
    Shared.InitialiseCriteria(SearchCriteria); 
    SearchCriteria.DepartmentID = DepartmentID; 
    SearchCriteria.PageSize = 15; 
    SearchCriteria.FreeText = searchTerm; 

    var model = await DoStuff(SearchCriteria); 

     if (Request.IsAjaxRequest()) 
     { 
      return PartialView("_ConversationList", model); 
     } 
    return View(model); 

} 

और यहाँ इंतजार कार्य इस कॉल GetConversation जो अनिवार्य रूप से कार्य हो जाता है जब पहला काम पाया जाता है मैं इसे सूचकांक को देखने के लिए लोड करने की आवश्यकता है:

private async Task<Result> DoStuff(CSearchCriteria SearchCriteria) 
{ 

    return GetConversations(SearchCriteria); 
} 
+0

आप आगे की व्याख्या कर सकते वास्तव में क्या आप होने की अपेक्षा है, और क्या वास्तव में क्या होता है? – sinelaw

+0

मैं डीबी में प्राप्त कार्यों को एक-एक करके आंशिक दृश्य में लोड करना चाहता हूं ताकि उपयोगकर्ता लोडिंग स्क्रीन पर अभिनीत न हो, इस समय केवल चार सेकंड लोड होने के लिए लगभग 10 सेकंड लगते हैं। यदि आवश्यक हो तो मैं अधिक जानकारी प्रदान कर सकता हूं ... – user2711252

उत्तर

4

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

तो, मुझे नहीं लगता कि आप एसिंक नियंत्रक के साथ जो चाहते हैं उसे प्राप्त कर सकते हैं (आप इसका उपयोग कर सकते हैं लेकिन यह आपकी समस्या का समाधान नहीं करेगा)।

मुझे लगता है कि आप डेटा के हिस्सों को पुनर्प्राप्त करने के लिए सर्वर-साइड पर किसी प्रकार की पेजिंग को कार्यान्वित कर सकते हैं और इसे SignalR के माध्यम से क्लाइंट को भेज सकते हैं।

+0

+1। मेरे पास एक ब्लॉग पोस्ट है जो बताता है कि ['async' HTTP प्रोटोकॉल नहीं बदलता है] (http://blog.stephencleary.com/2012/08/async-doesnt-change-http-protocol.html)। –

+0

@Alex आपकी प्रतिक्रिया के लिए धन्यवाद, क्या आप संभवतः सलाह दे सकते हैं कि मैं वांछित परिणाम कैसे प्राप्त कर सकता हूं, मैंने थ्रेडिंग की भी कोशिश की है, लेकिन डीबी से पहला कार्य पुनर्प्राप्त करने के बाद मेरे इंडेक्स व्यू को रीफ्रेश/अपडेट करने का तरीका सुनिश्चित नहीं है। – user2711252

+0

मैंने अपनी राय के साथ एक जवाब अपडेट किया है कि इसे कैसे करें। –

0

यहाँ मुद्दों के एक जोड़े हैं:

  • ASP.NET जैसे ही डेटा लौटने शुरू करने के लिए के रूप में प्रत्येक आइटम उपलब्ध है कैसे पैदा करने के लिए,
  • ग्राहक & सर्वर कैसे समन्वय करने के लिए, ताकि ग्राहक को पता है कि एक नया आइटम उपलब्ध है (यानी, तो यह अलग जवाब में प्रत्येक आइटम पार्स कर सकते हैं, या तो यह अधिक डेटा का अनुरोध कर सकते हैं 'पुल' के लिए देख रहे हैं)

रूप AlexK के जवाब में बताया गया है, async एपी डो सर्वर क्लाइंट को जिस तरह से प्रतिक्रिया देता है उसे परिवर्तित नहीं करता है। Async केवल आपके ऐप को थ्रेड को मुक्त करने की अनुमति देता है जब वे उपयोग में नहीं होते हैं, और कई संसाधनों पर निर्भर अनुरोधों के भाग समानांतर करना आसान बनाता है।

सिग्नलआर का उपयोग करने के अलावा, जिसे इसके लिए डिज़ाइन किया गया है, आप अंतर्निहित निचले स्तर के तंत्र का उपयोग कर सकते हैं - PushStreamContent - स्वयं। "सामग्री पुश"

  • Native HTML5 push notifications with ASP.NET Web API and Knockout.js के लिए नीचे स्क्रॉल, (एक ब्राउज़र में) क्लाइंट पक्ष के उदाहरण भी शामिल है -

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