2009-03-17 6 views
11

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

इस धागे को ट्रैक रखने के लिए सर्वोत्तम अभ्यास क्या हैं? मैं इस से पहले कभी नहीं किया है, और मैं एक छोटे से यह के कुछ पहलुओं को लेकर संदेह में हूँ:

  1. मुझे कैसे पता चलेगा अगर धागा अभी भी चल रहा है? मैं देखता हूं कि यह अपना काम करता है, लेकिन यह जानने का एक और तरीका है कि यह अभी भी जीवित है या नहीं? मैंने ProcMon डाउनलोड किया, लेकिन w3wp.exe बोटलोड धागे के बोतलबंद हो गया, इसलिए मुझे नहीं पता था कि मेरा धागा कौन सा था। मैंने इसे नाम दिया, लेकिन इससे मदद नहीं मिली।

  2. अगर यह मर जाता है तो मैं थ्रेड को कैसे पकड़ूं? क्या कोई प्रकार का निपटान विधि है जहां मैं इसे EventLog या कुछ विफल होने पर लिख सकता हूं? एक "मरने की घोषणा" या कुछ?

  3. मैं सक्रिय रूप से धागे को कैसे रोकूं? अगर मैं इसे पृष्ठभूमि प्रक्रिया को चलाने से रोकना चाहता हूं, तो मैं आईआईएस को उछाल दिए बिना इसे कैसे मारूं?

  4. क्या इसे फिर से शुरू करने के लिए है, स्वतंत्र रूप से HttpModule से? (मेरा अनुमान है कि यह करने के लिए जवाब नहीं है ...)

संपादित करें: बस स्पष्ट करने के लिए, इरादा है कि मेरे धागा दूर कभी नहीं जाता है। यह एक समारोह चलाता है, फिर कुछ मिनट के लिए सो जाता है, फिर उठता है और फिर फ़ंक्शन चलाता है। ऐसा नहीं है कि यह एक काम कर रहा है तो समाप्त हो रहा है।

+0

क्या आप एक सिस्टम प्राप्त कर रहे हैं। टाइमआउट त्रुटि? – TStamper

+0

उपेक्षा। जो इस पर लागू नहीं होना चाहिए – TStamper

उत्तर

6

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

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

यदि यह कोई विकल्प नहीं है, तो ई। जी। क्योंकि आप एक साझा होस्टिंग वातावरण में कर रहे हैं, मैं निम्नलिखित की सिफारिश करेंगे:

  1. Application_Start (Global.asax) में अपनी पृष्ठभूमि धागा प्रारंभ करें, और एक स्थिर चर में धागा संदर्भ की दुकान।
  2. कोशिश करें/पकड़ के साथ अपने पृष्ठभूमि धागे पर बुलाए गए प्रत्येक विधि को लपेटें, क्योंकि .NET 2.0 के बाद, पृष्ठभूमि थ्रेड पर प्रत्येक अनचाहे अपवाद एप्लिकेशन को बंद कर देगा। (इसे अगले अनुरोध पर पुनरारंभ किया जाएगा, लेकिन यह अगले अनुरोध को धीमा कर देता है, सभी मौजूदा सत्रों और कैशों को मारता है, और निश्चित रूप से अगले अनुरोध तक कोई टाइमर सक्रिय नहीं होगा।)
  3. प्रत्येक अनुरोध पर (लागू एक HttpModule है या ग्लोबल.एक्सएक्स में फिर से), वैश्विक चर में थ्रेड इंस्टेंस की जांच करें (क्या यह अभी भी है! = शून्य, थ्रेड सक्रिय और चल रहा है आदि)। यदि नहीं, तो पुनरारंभ कोड को कॉल करें। यह सुनिश्चित करने के लिए कि थ्रेड एक ही समय में दो बार नहीं बनाया जाएगा, पुनरारंभ भाग में लॉकिंग का उपयोग करें।

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

9

जब जेफ ने स्टैक ओवरफ्लो बनाया, तो उसे एक समान समस्या थी।

उसका समाधान कैश की समाप्ति का उपयोग करना था। आप कैश में कुछ डाल देंगे और फिर जब यह किसी ईवेंट को समाप्त कर देता है तो गैर-उपयोगकर्ता के सामने वाले थ्रेड में निकाल दिया जाता है। समाप्ति के लिए ईवेंट हैंडलर में, आप कैश करने के लिए आइटम को फिर से जोड़ सकते हैं और जो कुछ भी गृह व्यवस्था काम आपके आवेदन

इस तकनीक का उपयोग करते हुए के लिए किया जाना चाहिए करने के लिए कुछ कोड छड़ी, अपने subquestions आसानी से उत्तर दिया जाता है:

  1. आप जांचते हैं कि आइटम अभी भी कैश में है।
  2. यदि आइटम कैश में नहीं है, तो इसे दोबारा जोड़ें।
  3. कैश से कैश आइटम को हटाएं।
  4. आइटम को वापस कैश में जोड़ें।

आप इन विकल्पों को कॉन्फ़िगर करने के लिए एक छोटा प्रबंधन पृष्ठ बना सकते हैं।

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