2011-01-24 5 views
5

मेरे पास एक वेब एप्लिकेशन है और पृष्ठ के पीछे कोड में, मेरे पास एक बटन क्लिक ईवेंट है।सी # वेब अनुप्रयोग में समस्या को थ्रेड करना

protected void btnUpload_Click(object sender, EventArgs e) 
     { 
      TimerEvent TE = new TimerEvent(); 
      TE.TimerEvents(); 
      Server.Transfer("~/Jobs.aspx"); 
     } 

मैं एक विधि कॉल TimerEvents हो रहा है() है और यह 10-15 सेकंड लेने के नियंत्रण वापस सर्वर हस्तांतरण करने के लिए कर सकते हैं। इसलिए मैं विधि कॉल के एक ही समय में सर्वर ट्रांसफर लाइन को एक साथ निष्पादित करना चाहता हूं।

मैं यहाँ के रूप में सूत्रण की कोशिश की:

TimerEvent TE = new TimerEvent(); 
    Thread t = new Thread(TE.TimerEvents); 
    t.IsBackground = true; 
    t.Start();   
    Server.Transfer("~/Jobs.aspx"); 

लेकिन हस्तांतरण, नहीं किया जाता है जब तक विधि समाप्त हो गया है। मैं यह कैसे प्राप्त कर सकते हैं?

+0

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

+0

विधि किसी भी नई फ़ाइलों के लिए एक फ़ोल्डर को मतदान करने के लिए माना जाता है (उस फ़ोल्डर में इनपुट फाइल के प्रसंस्करण के बाद उस फ़ोल्डर में नई फाइलें रखी जाएंगी), इसलिए प्रसंस्करण में 10-15 सेकंड लग सकते हैं जिन्हें अनुकूलित नहीं किया जा सकता है (यह matlab फ़ाइल है और इसे समय की आवश्यकता है)। और मैं उपयोगकर्ता को 10-15 सेकेंड के लिए इंतजार नहीं कर सकता। इसलिए समस्या है। – superstar

उत्तर

4

यह डिज़ाइन आदर्श नहीं है। यहां तक ​​कि यदि आप इसे सही मानते हैं, तो एक मौका है कि आप बहु-थ्रेडिंग कोड और सर्वर। ट्रांसफर() कॉल के मिश्रण के कारण सड़क के नीचे समस्याओं में भाग लेंगे।

एएसपी.NET अनुप्रयोगों में बहु-थ्रेडिंग के संबंध में भी मुद्दे हैं।

मेरा सुझाव है कि आप अपने ऐप को फिर से इंजीनियर करें ताकि आपके पास कुछ प्रकार की कतार हो जो लंबे समय तक चलने वाले कार्यों को कतारबद्ध करे। उसके बाद आप एक ऐसी सेवा कर सकते हैं जो कतार में कार्यों को एक-एक करके संसाधित करे।

  1. कतार अप बाहरी सेवा से लंबी चलने वाली TimerEvents कार्य:

    अपने वेब अनुप्रयोग से, अब आप कर सकेंगे।

  2. कॉल Server.Transfer()

  3. नया पृष्ठ ("~/Jobs.aspx") पर, जब आप इसकी आवश्यकता है अपने परिणामों को लेने के लिए बाह्य सेवा कहते हैं।

+0

मैं आपका पॉइंट देखता हूं। क्या आप इसे प्राप्त करने के लिए किसी भी संदर्भ के साथ कतार और बाहरी सेवा पर विस्तार कर सकते हैं। धन्यवाद – superstar

+0

वास्तव में मैंने आपके द्वारा प्रस्तावित विचार पसंद करना शुरू कर दिया। इस पर कोई भी विस्तार मेरे लिए बहुत उपयोगी होगा। धन्यवाद। – superstar

+0

विचार यह है कि बाहरी सेवा भंडारण स्थान पर मतदान करेगी जहां अनुरोध किए जा सकते हैं। अधिकांश डेवलपर्स बस डेटाबेस तालिका का उपयोग करते हैं जिसमें request_id, request_date, स्थिति, और अनुरोध कॉलम हैं। हालांकि, एक्सएमएल फाइलों को डिस्क पर सहेजकर या एमएसएमक्यू का उपयोग करके एक ही चीज हासिल की जा सकती है। सेवा भंडारण स्थान का चुनाव करती है, अनुरोध और पोस्ट परिणामों को संसाधित करती है और फिर अगले अनुरोध पर जाती है। बाद में कॉलर अनुरोध के परिणामस्वरूप * परिणाम क्षेत्र * (या बस डीबी तालिका में स्थिति कॉलम) की जांच कर सकता है। – tenor

0

प्रक्रिया इसी तरह से अक्सर में दोहराया है, क्या आपको कोई "एप्लिकेशन घटना" कहेंगे क्यों एक प्रक्रिया Global.asax (आवेदन) फ़ाइल से एक sperate धागे पर settup नहीं। आप निर्देशिका की निगरानी करने के लिए FileWatcher क्लास का उपयोग कर सकते हैं और अनुक्रमिक रूप से फ़ाइलों को संसाधित कर सकते हैं या प्रत्येक फ़ाइल के लिए अपनी खुद की थ्रेड में किसी अन्य प्रक्रिया को लॉन्च करके, आप एक स्थिति और किसी भी परिणाम को जारी रख सकते हैं और क्लाइंट को संभवतः AJAX समय का उपयोग करके इसका खुलासा कर सकते हैं वापस कॉल करें।

ग्लोबल.एएसएक्स फ़ाइल से बुलाए गए तरीकों में सभी अपवादों को सही तरीके से संभालने के लिए याद रखें क्योंकि वे पूरे ऐपडोमेन को नीचे ला सकते हैं।

Global.asax

0

सबसे आसान काम करना है: मैं सिर्फ तुरंत लौट सकते हैं और कहते हैं कि लेकिन उसके बाद अपने 'jobs.aspx' पृष्ठ पर एक ऑटो ताज़ा करने के लिए और के लिए स्थिति दिखाएगा "आप फ़ाइल अपलोड कर दिया गया हो" होगा के रूप में "प्रसंस्करण" जब तक यह "हो गया" है

संभालने jobs.aspx अपने प्रसंस्करण कार्यों की सूची है ... और यह कि 'स्वत: रीफ्रेश' भी janky :)

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