2008-09-08 16 views
8

में मल्टीथ्रेडिंग एएसपीनेट में आपको किस तरह के बहु-थ्रेडिंग मुद्दों पर सावधान रहना होगा?एएसपीनेट

+0

+1 अच्छा प्रश्न – Nick

+0

मुद्दों पर निश्चित ब्लॉग (हालांकि दिनांकित) फिल हैक्स है http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks- in-asp-net.aspx/क्वार्ट्ज.NET और हैंगफायर जैसे पृष्ठभूमि प्रक्रियाओं को चलाने के लिए कई ढांचे हैं। यदि आप 90 सेकंड की बाधा के साथ रह सकते हैं, तो आप QueueBackgroundWorkItem का भी उपयोग कर सकते हैं। यदि आप Azure, वेब जॉब्स या क्लाउड सेवाओं पर हैं। – RickAndMSFT

उत्तर

0

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

एक और जगह जो मैं जांचूंगा वह फाइल कोड को एक्सेस करने जैसे फ़ाइल सिस्टम तक पहुंचने वाला कोई भी कोड है। यदि किसी अनुरोध पर फ़ाइल पर रीड-राइट लॉक है, तो अन्य समवर्ती अनुरोध ठीक से संभाल नहीं पाएंगे।

6

चीजें जो समाप्त हो जाती हैं (मुझे लगता है कि httpContext करता है) पर देखने के लिए एक चीज, यदि आप इसे "आग और भूलने" के संचालन के लिए उपयोग कर रहे हैं तो याद रखें कि अचानक अगर एएसपीनेट क्लीनअप कोड पहले चलता है आपका ऑपरेशन पूरा हो गया है, आप कुछ जानकारी तक पहुंच नहीं पाएंगे।

2

यदि यह एक वेब सेवा के लिए है, तो आपको निश्चित रूप से थ्रेड पूलिंग पर विचार करना चाहिए। बहुत सारे धागे आपके आवेदन को पीसने के लिए लाएंगे क्योंकि वे अंततः CPU समय के लिए प्रतिस्पर्धा करना शुरू कर देंगे।

क्या यह फ़ाइल या नेटवर्क आईओ के लिए है? यदि ऐसा है, तो आपको asynchronous IO का उपयोग करने पर भी विचार करना चाहिए। यह कार्यक्रम के लिए थोड़ा दर्द हो सकता है, लेकिन आपको एक ही समय में बहुत से धागे को खत्म करने की चिंता करने की ज़रूरत नहीं है।

9

एएसपी.NET पृष्ठ के कोड-पीछे से धागे को फेंकना जोखिम भरा है, क्योंकि कार्यकर्ता प्रक्रिया कभी-कभी पुनर्नवीनीकरण की जाएगी और आपका धागा मर जाएगा।

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

+1

आप इस तकनीक को स्टैक ओवरफ्लो पर कई प्रश्नों में वकालत करने की प्रतीत कर रहे हैं, और मुझे लगता है कि यह लंबी चल रही प्रक्रिया के लिए जाने का तरीका है उदाहरण के लिए, बिलिंग प्रक्रिया। क्या कोई नमूना कोड है जिसे आप साझा कर सकते हैं? या एक कीवर्ड बिंग करने के लिए? – Salamander2007

+1

पृष्ठभूमि प्रक्रियाओं को चलाने के लिए कई ढांचे हैं जो एमएसएमक्यू के साथ इन सभी को लागू करने के बजाय उपयोग करने में बहुत आसान हैं। उदाहरण के लिए, • क्वार्ट्ज.नेट और हैंगफायर। यदि आप 90 सेकंड की बाधा के साथ रह सकते हैं, तो आप QueueBackgroundWorkItem का भी उपयोग कर सकते हैं। यदि आप Azure, वेब जॉब्स या क्लाउड सेवाओं पर हैं। – RickAndMSFT

0

आईआईएस कॉन्फ़िगरेशन में 25 कुल थ्रेड की कोई सीमा नहीं है? कम से कम आईआईएस 6 में मेरा मानना ​​है। यदि आप उस सीमा से अधिक हैं, रोचक चीजें (पढ़ें: loooooooong प्रतिक्रिया समय) हो सकता है।

0

जहां तक ​​आपको आवश्यकता है, उस पर निर्भर करते हुए, जहां तक ​​बहु थ्रेडिंग का संबंध है, क्या आपने क्लाइंट से अनुरोधों को हल करने का विचार किया है। AJAX का उपयोग करके अनुरोधों को स्पैन करना सुरक्षित है, और फिर कॉलबैक में परिणामों पर कार्य करें। या एक पृष्ठभूमि तंत्र के रूप में एक सेवा का उपयोग करें, जो पृष्ठभूमि में हर एक्स मिनट और प्रक्रियाओं को चलाता है।