2011-03-29 20 views
5

मेरे पास एक एएसपी.नेट एमवीसी 3 (.NET 4) वेब एप्लिकेशन है।असीमित थ्रेड को बंद करने के लिए वर्तमान और अनुशंसित तरीका क्या है?

मेरे पास [HttpPost] एक्शन विधि है जो डेटाबेस में कुछ डेटा सबमिट करती है।

अब, इस विधि के बाद भंडार के लिए परिष्करण समाप्त हो रहा है, मैं एक "पृष्ठभूमि" कार्य निष्पादित करना चाहता हूं (ऑडिटिंग सोचना, या एक ईमेल भेजना आदि), जहां मुझे परिणाम की परवाह नहीं है (जब तक कोई त्रुटि न हो होता है, इस मामले में मैं लॉगिंग करूँगा)।

मैं अपने कार्य विधि से इस कार्य को कैसे बंद कर सकता/सकती हूं?

[HttpPost] 
[Authorize] 
public ActionResult Create(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     _repo.Save(model); 
     // TODO: Fire off thread 
     return RedirectToRoute("Somepage", new { id = model.id }); 
    } 
    return View(model); 
} 

उत्तर

4

नया .NET 4 तरीका यह है एक Task के साथ है।

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx

Task.Factory.StartNew(MyBackgroundAction); 

लेकिन इस सरल ऑपरेशन जहां आप इसे चलाना चाहते हैं और कार्यों के समन्वय के बारे में परवाह नहीं है के लिए, यह ThreadPool उपयोग करने के लिए बस के रूप में आसान है।

ThreadPool.QueueUserWorkItem(MyBackgroundAction) 

आप एक नया हर कार्रवाई के लिए अपने आप को थ्रेड बनाने से बचना चाहते हैं - it'll अधिक संसाधनों को लेने के लिए और अनावश्यक रूप से बेकार है।

यदि आप पृष्ठभूमि कार्य लंबे समय से चल रहे हैं तो आप निर्माता/उपभोक्ता कतार स्थापित करना चाहेंगे और कार्यों को चलाने के लिए लगातार चल रहे पृष्ठभूमि धागे की एक या सेट संख्या हो सकती है।

+0

आपके उत्तर के लिए धन्यवाद।एक स्पष्टीकरण - "आप हर कार्रवाई के लिए खुद को एक नया थ्रेड बनाने से बचना चाहते हैं - यह अधिक संसाधन उठाएगा और अनावश्यक रूप से अपर्याप्त है" - मैं इसे और कैसे कर सकता हूं? मैं फिर नया धागा कहां बना सकता हूं? उदा। मैं 'ThreadPool.QueueUserWorkItem (MyBackgroundAction) 'कॉल कहां रखूं? – RPM1984

+1

@ RPM1984 QueueUserWorkItem का उपयोग करना मतलब है कि कार्य एक थ्रेड द्वारा पूरा किया जाएगा जो पहले से ही एएसपी.Net थ्रेड पूल का हिस्सा है। ये थ्रेड कतार से लगातार काम कर रहे हैं और उन्हें पूरा कर रहे हैं, और आप अपने कोड में कहीं से भी एक नया कार्य संलग्न कर सकते हैं। हालांकि, मेरे उत्तर में जुड़े एएसपी.Net में इसकी बड़ी डाउनसाइड्स है। –

+0

@ क्रिस - आपकी मदद और उत्तर के लिए धन्यवाद। बात यह है कि यह एक (अपेक्षाकृत) सरल ऐप है जिसमें भारी ट्रैफिक या समवर्ती उपयोगकर्ता नहीं हैं। अतीत में (संस्करण 1), हमने 'थ्रेड.स्टार्ट' का उपयोग किया और यह ठीक था। तो मुझे लगता है कि मैं 'ThreadPool.QueueUserWorkItem' के साथ जा रहा हूँ। – RPM1984

0
// Fire off thread 
var t = new System.Threading.Thread(() => 
{ 
    // do whatever 
}); 
t.Start(); 

"है जो कुछ भी" आप होना चाहिए ट्राई/कैच कि किसी भी अपवाद लॉग में।

2

यह असीमित कार्यों के लिए सामान्य ill-advised to use the Thread Pool in ASP.Net में है।

ध्यान दें कि यह प्रश्न here पर स्पर्श किया गया है, हालांकि मैं उत्तर से सहमत नहीं हूं। स्वीकार्य उत्तर मानता है कि आपको अब किए गए काम की आवश्यकता है, जब इस प्रश्न द्वारा वर्णित एक असीमित कार्य के लिए आसानी से बाद में किया जा सकता है। यह लंबे समय तक फैलता प्रसंस्करण की अनुमति देता है, जब भार समान नहीं होता है (अधिकांश वेब पेजों की तरह)।

प्रत्येक अनुरोध के लिए स्पॉन्गिंग थ्रेड भी उप-शीर्ष है, क्योंकि बनाए गए धागे की संख्या को बाध्य करने का कोई आसान तरीका नहीं है। 100 वास्तविक कार्य आपके वेब एप्लिकेशन के साथ "वास्तविक समय" कार्य करने की कोशिश कर रहे हैं।

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

अतीत में मैंने अच्छे प्रभाव के लिए MSMQ का उपयोग किया है।

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

  • कोई संबंधित समस्या नहीं^_^