2010-07-01 18 views
6

क्या पृष्ठभूमि कार्यकर्ता से सबकुछ लोड करना बुरा विचार है ?? वर्तमान कोड Form_load पर निष्पादित किया गया है। हम webservice से बहुत सारे डेटा खींच रहे हैं। कुछ लंबे समय तक चलने वाले काम पृष्ठभूमि कार्यकर्ता में हैं।पृष्ठभूमि कार्यकर्ता सी # winform

क्या पृष्ठभूमि कार्यकर्ता से सब कुछ लोड करना बुरा विचार होगा चाहे कोई कोड कितना छोटा या बड़ा हो ?? पृष्ठभूमि कार्यकर्ता में चलाने के लिए हर समारोह? या यह इस कोड को गन्दा और डरावना दुःस्वप्न बनाने जा रहा है।

धन्यवाद।

+1

आपका शीर्षक Winform कहता है लेकिन आप पृष्ठ_लोड का उल्लेख करते हैं। क्या यह Winforms या webforms है? –

+1

चीनी !!! माफ़ कीजिये। Form_load – RedPanda

+0

निराशा के पर्याप्त वैकल्पिक अभिव्यक्तियों का उपयोग नहीं किया जाता है। : पी – Russell

उत्तर

2

कोड का आकार एक मीट्रिक नहीं है जिसे आप निर्धारित करने के लिए उपयोग करना चाहिए कि अलग थ्रेड पर काम करना है या नहीं। निष्पादन की सबसे खराब स्थिति लंबाई है।

सबसे पहले, ऐसे कई यूआई डिज़ाइन नहीं हैं जहां Form_Load पर काम का एक गुच्छा बंद करना वास्तव में वांछनीय है। यदि यह संभव है, तो मैं आमतौर पर या तो:

  • उपयोगकर्ता कार्रवाई के जवाब में सीधे फॉर्म खोलने से पहले उस कार्य को आरंभ करें।
  • सभी काम पृष्ठभूमि में ले जाएं और असीमित रूप से अपडेट करें (बाइंड?) परिणाम को परिणाम में अपडेट करें।
  • तब तक कार्य विलंब करें जब तक कि उपयोगकर्ता विशेष रूप से कुछ क्रियाएं नहीं करता जिसके लिए इसकी आवश्यकता होती है।

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

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

+0

यह हमारी समस्या थी। कुछ कोड Form_load में web_service कहते हैं लेकिन web_service कुछ देर हो चुकी है, यूआई अप्रतिबंधित हो जाता है और ग्राहक इसे टूटा हुआ लगता है। पिछला सॉफ्टवेयर पावरबिल्डर में था और उसे सी # में परिवर्तित कर दिया गया था, प्रत्येक फ़ंक्शन को web_service में बदल दिया गया था। वे पिछले सॉफ़्टवेयर के तेज़ी से अपेक्षा कर रहे हैं लेकिन हम पहले दो बार डेटा खींच रहे हैं: '( आपका उत्तर धन्यवाद। – RedPanda

1

BackgroundWorker आमतौर पर Winforms UI को अधिक उत्तरदायी बनाने के लिए उपयोग किया जाता है। आप वेब अनुप्रयोग में पृष्ठभूमि प्रसंस्करण के लिए इसका उपयोग कर सकते हैं, लेकिन मैं नहीं करता; मैं विंडोज सेवा में ThreadPool का उपयोग करता हूं।

1

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

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

+0

सहमत होने में परेशानी है। यह कितना समय ** आमतौर पर ** लेता है यहां महत्वपूर्ण नहीं है। यह महत्वपूर्ण है कि ** ** ** कितना समय ले सकता है (सबसे खराब मामला)। – hemp

1

पृष्ठभूमि कार्यकर्ता पृष्ठभूमि कार्यकर्ता के लिए धागे को बनाने और नष्ट करने के लिए अतिरिक्त समय लेगा। यदि यह कोड का एक छोटा सा टुकड़ा है (प्रसंस्करण-वार) यह मुख्य यूआई थ्रेड का उपयोग करने के लिए तेज़ हो सकता है।

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

यह कई कारकों पर निर्भर:

  • कोड के छोटे/बड़े टुकड़े की संख्या - यह एक ही समय में चल रहे थ्रेड की संख्या को प्रभावित करेगा।
  • आवेदन के लिए प्रतिक्रिया और प्रदर्शन का महत्व
  • आवेदन के लिए रखरखाव/स्केलेबिलिटी का महत्व।
0

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

आनंद लें!

+0

ओपी ने टिप्पणी में इसे स्पष्ट किया। मैं गलती को ठीक करने के लिए प्रश्न समायोजित करूंगा। – Russell

1

चाहे यह एक अच्छा विचार है या नहीं, आपकी समस्या के विनिर्देशों पर बहुत अधिक निर्भर करता है। क्या आपको एक ही कॉल में सभी डेटा खींचना है या आप इसे स्वतंत्र हिस्सों में कर सकते हैं?

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

इसके अलावा, वेबफॉर्म में (जब से आप पेज_लोड का उल्लेख करते हैं) आईआईआरसी आप एएसपी के साथ थ्रेड पूल साझा करेंगे।नेट, और आप समवर्ती अनुरोध/उपयोगकर्ताओं के कुछ सीमाओं पर अपने ऐप को कम प्रतिक्रियाशील बन सकते हैं।

1

व्यक्तिगत रूप से, मैं कोड को एक कार्यकर्ता थ्रेड में नहीं डालूंगा जब तक कि एक विशिष्ट प्रक्रिया शामिल कोड यूआई प्रतिक्रिया के साथ हस्तक्षेप नहीं कर रहा था। ऐसा कोई कारण नहीं है कि मैं सोच सकता हूं कि सब कुछ एक कार्यकर्ता थ्रेड पर रखे। आम तौर पर जब आप किसी वेब सेवा जैसे बाह्य संसाधन की प्रतीक्षा कर रहे होते हैं (जब तक आप Form_Load :-) पर प्राइम नंबर की गणना नहीं कर लेते हैं, तब तक आपके पास केवल प्रतिक्रिया समस्याएं होती हैं।

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

+0

धन्यवाद। मैं "हैलो वर्ल्ड" एसिंक्रोनस वेब सेवा करूंगा। : पी – RedPanda

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