2012-03-28 16 views
6

में एसिंक अनुरोध को संभालना मेरे पास एक एएसपी.नेट एमवीसी 3 एप्लीकेशन है जो समय लेने वाली प्रक्रियाओं को संभालता है (नेटवर्क से बड़ी फाइल कॉपी करता है)। क्या हम क्या करना चाहते है:एएसपी.नेट एमवीसी

  1. उपयोगकर्ता प्रपत्र पोस्ट करने के लिए प्रक्रिया
  2. आवेदन को गति प्रदान करने के लिए एक बटन क्लिक करता है एक नया धागा फ़ाइल
  3. आवेदन संदेश फ़ाइल नकल कह चलता कॉपी करने शुरू करने के लिए शुरू होता है प्रक्रिया शुरू हो गई है
  4. प्रतिलिपि संसाधित और पृष्ठभूमि में समाप्त होने पर उपयोगकर्ता ब्राउज़र बंद कर सकता है।

विचार यह है कि उपयोगकर्ता को प्रक्रिया की प्रगति पर किसी भी पुष्टि की आवश्यकता नहीं है, न ही प्रक्रिया पूरी होने पर अधिसूचित की जानी चाहिए।

वर्तमान में हम नियंत्रक को विंडोज सेवा में एक ईवेंट ट्रिगर करने देते हैं, और वास्तविक कार्य करने के लिए विंडोज सेवा का उपयोग करते हैं। मैं सोच रहा हूं कि ऐसा करने के लिए एक बेहतर/साफ तरीका है?

+3

एमवीसी 3 के लिए, मेरा एमएसडीएन आलेख देखें: http://msdn.microsoft.com/en-us/library/ee728598(VS.98).aspx यदि आप एमवीसी 4 और डेवलपर एक्सप्रेस 11 का उपयोग कर सकते हैं, तो मैं हूं एक नया Async/एमवीसी ट्यूटोरियल लिखना जो बहुत आसान है। – RickAndMSFT

उत्तर

6

आप System.Threading.Tasks.TaskStartNew विधि को Action delegate पर कॉल कर सकते हैं।

उन उपकरणों के लिए अपने नियंत्रक का उपयोग करते हुए कुछ इस तरह दिखेगा:

[HttpPost] 
public ActionResult DoSomethingLongRunning() 
{ 
    if (ModelState.IsValid) 
    { 
     Task.Factory.StartNew(() => 
        fileCopier.CopyFile(CopyFileParameter1, CopyFileParameter2)); 

     return RedirectToAction("View Indicating Long Running Progress"); 
    } 
    else 
    { 
     // there is something wrong with the Post, handle it 
     return View("Post fallback view"); 
    } 
} 

एक अन्य विकल्प आप System.Reactive.Concurrency और TaskPoolScheduler कार्रवाई करने के लिए ठोस कार्यान्वयन के रूप में साथ IScheduler इंटरफ़ेस का उपयोग कर सकता है (संभवतः नियंत्रक निर्माता में इंजेक्शन ।

public ActionResult DoSomethingLongRunning() 
{ 
    if (ModelState.IsValid) 
    { 
     ISchedulerImplementation.Schedule(new Action(() => 
     { 
      fileCopier.CopyFile(CopyFileParameter1, CopyFileParameter2); 
     })); 
     return RedirectToAction("View Indicating Long Running Progress"); 
    } 
    else 
    { 
     // there is something wrong with the Post, handle it 
     return View("Post fallback view"); 
    } 
} 

एक लाभ के रूप में, आप इसे इस तरह से आप इंटरफ़ेस जब आप इकाई परीक्षण कर रहे हैं के कार्यान्वयन के रूप में TestScheduler उपयोग कर सकते हैं करते हैं।

+0

यह एक विकल्प हो सकता है लेकिन यह इस मामले में सबसे अच्छा समाधान नहीं है। चूंकि उपयोगकर्ता को ट्रिगर प्रक्रिया के पूरा होने के बारे में अधिसूचित होने की आवश्यकता नहीं है, इसलिए यह विंडोज़ सेवा में पूरी तरह से अलग किया जा सकता है यह सुनिश्चित करता है कि यह वेब सर्वर डाउन होने पर भी काम करता है। –

3

मुझे लगता है कि विंडोज सेवा होस्ट होने पर आपकी लंबी चल रही प्रक्रिया सबसे अच्छी शर्त है। यदि यह आईआईएस द्वारा होस्ट किया गया है, तो आप हमेशा निष्क्रियता के लिए मारने वाले ऐप पूल को जोखिम देते हैं।

एक संबंधित संभावना है कि आप अपनी विंडोज सेवा के अंदर एक डब्ल्यूसीएफ सेवा होस्ट करें और सेवा के लिए बाहरी HTTP या अन्य एंडपॉइंट प्रदान करें। इस तरह आपका वेब इंटरफ़ेस आपकी डब्ल्यूसीएफ सेवा की "प्रारंभ" अनुबंध विधि को कॉल कर सकता है, और संभावित रूप से अन्य विधियों की आवश्यकता हो सकती है।

+0

अच्छी प्रतिक्रिया, आईआईएस (यहां तक ​​कि एक अलग ऐप पूल के तहत) के तहत सबकुछ होस्ट करना आपकी प्रक्रिया को अलग नहीं करता है और इसे स्वतंत्र नहीं बनाता है। अगर आईआईएस बंद हो जाता है, तो सबकुछ बंद हो जाता है। आईआईएस या विंडोज सेवा पर होस्टिंग के बीच मतभेदों पर भी इस लिंक पर एक नज़र डालें: http://social.msdn.microsoft.com/Forums/en/wcf/thread/015d711d-ce5a-46a1-a93e-1c68746e76d3 –

2

मैं आईआईएस 7 डब्ल्यूएएस में आयोजित डब्ल्यूसीएफ एमएसएमक्यू सेवा के लिए एक अनुरोध पोस्ट करूंगा। an awesome article इसे कैसे सेट अप करें।

बाह्य संसाधनों का उपयोग करके लंबे समय तक चलने वाले कार्यों में विफलता का उच्च जोखिम होता है। सबसे बड़ी गलती डेवलपर्स अक्सर यह मानते हैं कि हार्डवेयर और नेटवर्क की असीमित क्षमता है और वे बहुत विश्वसनीय हैं। यह अक्सर नहीं होता है।

यह समस्याग्रस्त, यहां तक ​​कि आपदाजनक भी हो सकता है, यदि लंबे समय तक चलने वाली प्रक्रिया नेटवर्क कनेक्टिविटी के क्षणिक रूप से हानि या रिमोट सर्वर को रीबूट किया गया है तो बाधित हो सकती है। यदि आपकी लंबी चलती प्रक्रिया में अतिरिक्त प्रसंस्करण शामिल है, जैसे फ़ाइल को अनजिप करना, या इसका विश्लेषण करना, तो प्रसंस्करण करने के लिए पर्याप्त स्मृति नहीं होने पर आप विफलता का और जोखिम चला सकते हैं। उपयोगकर्ता बहुत से अनुरोध सबमिट कर सकते हैं और समवर्ती मुद्दों को संभालने के लिए पर्याप्त संसाधन उपलब्ध नहीं हैं। यदि आप अपने एएसपी.नेट एमवीसी अनुप्रयोग को async controllers के माध्यम से प्रसंस्करण करते हैं, तो आप आश्चर्यचकित हो सकते हैं जब आईआईएस कामकाजी प्रक्रिया को फिर से चलाता है जब आपकी लंबी चल रही प्रक्रिया बाधित होती है।

एमएसएमक्यू 4 इन जोखिमों को कम करने के लिए एक बेहतर काम करता है। अगर प्रक्रिया विफल हो जाती है, तो आप इसे छोड़ने से पहले दो बार पुनः प्रयास कर सकते हैं। आप here को सेट अप करने के तरीके सीख सकते हैं। आप ऐसे मामले को संभालने के लिए application specific deadletter queues का उपयोग कर सकते हैं जहां कई स्वीकार्य प्रयासों के बाद प्रक्रिया विफल रही। परिचालन कर्मचारियों के लिए मुद्दों का निदान करना महत्वपूर्ण है। आप इस योजना का उपयोग ईमेल के माध्यम से किसी उपयोगकर्ता को सूचित करने के लिए भी कर सकते हैं कि प्रक्रिया विफल हुई (या सफल हुई), भले ही मशीन से अनुरोध किया गया हो।

विंडोज़ सेवा के बजाए आईआईएस में इसे होस्ट करना अतिरिक्त क्षमताओं की पेशकश करता है। उदाहरण के लिए, आईआईएस कार्यकर्ता प्रक्रिया को पुनर्नवीनीकरण किया जा सकता है, इसे डेडलॉक या स्मृति सीमा से अधिक होना चाहिए। उत्तरार्द्ध एक मुद्दा हो सकता है जब आप प्रसंस्करण करने के लिए कुछ देशी कोड का उपयोग कर रहे हैं। आप इसे हर चार रीसायकल कर सकते हैं (अपना टाइमफ्रेम चुनें) घंटे। बाद में प्रबंधित स्मृति की बड़ी ब्लॉब्स के साथ काम करते समय बाद में महत्वपूर्ण है क्योंकि समय के साथ बड़े ऑब्जेक्ट हेड इतने खंडित हो जाते हैं कि किसी अन्य बड़े अनुरोध के लिए पर्याप्त स्मृति आवंटित करना लगभग असंभव हो जाता है। आप पाते हैं कि Windows सेवा में होस्ट की गई डब्ल्यूसीएफ सेवा इस समस्या का सामना कर सकती है।

असल में यह इस बात पर निर्भर करता है कि आप पृष्ठभूमि प्रक्रिया को कितना विश्वसनीय चाहते हैं। यदि नहीं, डब्ल्यूसीएफ, एमएसएमक्यू और आईआईएस का उपयोग करना अधिक हो सकता है।

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