2013-04-27 3 views
6

एक एएसपी.नेट 3.5 वेबएप को कई कार्यों को शुरू करना है जो पूरा होने में घंटों लगते हैं। स्पष्ट कारणों से, जो पृष्ठ इन कार्यों को शुरू करते हैं, वे समाप्त होने की प्रतीक्षा नहीं कर सकते हैं और न ही कोई भी प्रतिक्रिया प्राप्त करने के लिए लंबे समय तक इंतजार करना चाहेगा, इसलिए कार्य अतुल्यकालिक होना चाहिए।एएसपी.नेट लंबे समय तक चलने वाला कार्य। थ्रेड को अपवादित किया जा रहा है

इन सभी लंबे समय तक चलने वाले कार्यों को संभालने के लिए एक सहायक वर्ग है।

public static bool ScheduleTask(TaskDescriptor task, Action action) 
{ 
    bool notAlreadyRunning = TasksAsync.TryAdd(task); 
    if (notAlreadyRunning) 
    { 
     Thread worker = null; 
     worker = new Thread(() => 
     { 
      try { action(); } 
      catch(Exception e) 
      { 
       Log.LogException(e, "Worker"); 
      } 
      TasksAsync.RemoveTask(task); 
      workers.Remove(worker); 
     }); 
     workers.Add(worker); 
     worker.Start(); 
    } 
    return notAlreadyRunning; 
} 

पहले कार्यान्वयन पर हम ThreadPool.QueueUserWorkItem दृष्टिकोण का उपयोग किया है, लेकिन परिणाम हमेशा एक ही कर दिया गया है: aprox के बाद मुख्य विधि है कि कार्यक्रम और इन कार्यों को निष्पादित करता है वर्तमान में निम्नलिखित है। 20-30 मिनट एक थ्रेड निरस्त किया जा रहा अपवाद फेंक दिया गया है।

क्या कोई जानता है कि यह क्यों हो रहा है? या इसे कैसे रोका जा सकता है?

अधिक जानकारी:

  • मानक विन्यास IIS। निर्णय

    अपनी प्रतिक्रियाओं के लिए आप सभी को धन्यवाद:

  • कार्य कुछ भी, एक डेटाबेस और/या आईओ संचालन आदि

अद्यतन करने के लिए querys हो सकता है। अब मुझे नहीं पता कि कौन सा प्रश्न उत्तर के रूप में चिह्नित है। वे सभी वैध हैं और इस समस्या के संभावित समाधान हैं। आज के लिए इंतजार करेंगे और सबसे ऊपर वोटों के उत्तर के जवाब के रूप में चिह्नित करेंगे, ड्रॉ के मामले में मैं पहले दिखाए गए उत्तर का चयन करूंगा, आमतौर पर उन्हें सबसे प्रासंगिकता का आदेश दिया जाता है।

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

+0

क्या आपके आईआईएस ऐपपूल/कर्मचारी रीसायकल करते हैं? –

+0

आईआईएस कॉन्फ़िगरेशन IIS 7 के लिए मानक कॉन्फ़िगरेशन है। तो हाँ, मुझे लगता है। – Unlimited071

+0

यह थोड़ी देर के बाद से है क्योंकि मैं एएसपी.नेट में घुटने टेक रहा हूं, लेकिन अगर स्मृति कार्य करता है, जब कार्यकर्ता रीसायकल की प्रक्रिया करता है तो वे धागे को रोक सकते हैं। रीसाइक्लिंग को अक्षम करने का प्रयास करें और देखें कि क्या यह थ्रेड गर्भपात का स्रोत है। (अगर यह मामला है तो वर्कअराउंड के बारे में सुनिश्चित नहीं है; जैसा कि मैंने कहा, _that_ विशेष समस्या को छुआ नहीं है) –

उत्तर

6

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

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

+0

मुझे लगता है कि आप सही हैं और यह लेने का दृष्टिकोण होगा, लेकिन समय प्रतिबंधों के कारण मुझे नहीं लगता कि हम इसे कर सकते हैं। – Unlimited071

+0

मुझे नहीं लगता कि आपको वास्तव में कोई विकल्प है। फिल हैक यह स्पष्ट करता है कि आईआईएस ऐसा करने के लिए डिज़ाइन नहीं किया गया है। आप एक नए एपडोमेन में धागे को कताई करने का प्रयास कर सकते हैं: http://www.pcreview.co.uk/forums/start-thread-new-appdomain-t3614317.html –

+0

मुझे नहीं पता था कि आप फ्लाई पर एक एपडोमेन बना सकते हैं इस तरह ... अनुमान है कि मैं इसके बारे में पढ़ूंगा। लेकिन अगर आप मुझे थोड़ा सा शोध बचा सकते हैं, तो थ्रेड समाप्त होने पर एपडोमेन के साथ क्या होता है? मूल रूप से मैं नए एपडोमेन के संसाधनों को मुक्त करने के लिए कैसे सुनिश्चित करूं? – Unlimited071

3

फिल हैक इस विषय पर अपने The Dangers of Implementing Recurring Background Tasks In ASP.NET पोस्ट में गहरे हो जाते हैं। उम्मीद है कि यह

+0

ग्रेट पोस्ट, साझा करने के लिए धन्यवाद! लेकिन समय प्रतिबंधों के कारण मुझे नहीं लगता कि हम एपडोमेन दृष्टिकोण कर सकते हैं। – Unlimited071

+0

फिल की पोस्ट अपने दिन में शानदार थी, अब कम से कम WAWS पर अप्रचलित है। अब आप Azure WebJobs का उपयोग कर सकते हैं – RickAndMSFT

4

संभावना है कि आप एक अलग ऐप पूल या कई अन्य हैक्स का उपयोग करके टाइमआउट को ऊपर उठाकर यह काम कर सकते हैं, लेकिन आपकी सबसे अच्छी शर्त यूई से लंबे समय तक चलने वाले कार्य को कम करने जा रही है और एएसपीनेट पूरी तरह से, और या तो एक सेवा का उपयोग करें (इसकी अनुशंसा नहीं करेगा) या एक निर्धारित कार्य जो काम करने के लिए चुनाव करता है; व्यक्तिगत रूप से मैं काम करने का ट्रैक रखने के लिए aws sqs/sns जैसे कुछ और विंडोज सर्वर में एक निर्धारित कार्य जो कुछ भी आवृत्ति को समझने के लिए चीजों की जांच करता है। एकमात्र चीज ui/asp.net को तब करने की ज़रूरत है, यह तथ्य है कि कुछ करने की ज़रूरत है, वास्तव में ऐसा नहीं करना चाहिए।

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

शायद आप अपनी तत्काल समस्या के लिए आवेदन कर सकते हैं, लेकिन बेहतर दीर्घकालिक समाधान के लिए विचार करने के लिए कुछ।

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