क्या यह एक कक्षा में एक धागा / पृष्ठभूमि कार्यकर्ता रखने के लिए "गलत" / बुरा डिज़ाइन है?


15

मेरे पास एक वर्ग है जो एक्सेल (सी # और। नेट 4) से पढ़ा जाएगा और उस वर्ग में मेरे पास एक पृष्ठभूमि कार्यकर्ता है जो एक्सेल से डेटा लोड करेगा जबकि यूआई उत्तरदायी रह सकता है। मेरा प्रश्न इस प्रकार है: क्या किसी कक्षा में पृष्ठभूमि कार्यकर्ता का होना बुरा है? क्या मुझे इसके बिना अपनी कक्षा बनानी चाहिए और उस वर्ग पर काम करने के लिए एक पृष्ठभूमि कार्यकर्ता का उपयोग करना चाहिए? मैं इस तरह से अपनी कक्षा बनाने के बारे में वास्तव में कोई समस्या नहीं देख सकता, लेकिन फिर मैं एक नौसिखिया हूं इसलिए मुझे लगा कि इससे पहले कि मैं जारी रखूं, मुझे यकीन है।

मुझे उम्मीद है कि यह सवाल यहां प्रासंगिक है क्योंकि मुझे नहीं लगता कि यह मेरे कोड के काम के रूप में स्टैकओवरफ्लो पर होना चाहिए, यह सिर्फ एक डिज़ाइन मुद्दा है।


3
आपको क्यों लगता है कि यह गलत हो सकता है?
Alb

1
@ एएलबी - यह कहना मुश्किल है। मेरा कोड काम करता है और मेरी जरूरतों को पूरा करता है, हालांकि, मैं इस परियोजना में इसका उपयोग करने की योजना बना रहा हूं कि मैं खुला स्रोत बनाऊंगा। मैं यह सुनिश्चित करना चाहता हूं कि मेरा कोड "बस काम" नहीं करता है और वास्तव में अच्छी तरह से डिज़ाइन किया गया है।
जेटी

जवाबों:


21

क्या मुझे इसके बिना अपनी कक्षा बनानी चाहिए और उस वर्ग पर काम करने के लिए एक पृष्ठभूमि कार्यकर्ता का उपयोग करना चाहिए?

हाँ तुम्हें करना चाहिए। और मैं आपको बताऊंगा कि क्यों - आप एकल जिम्मेदारी सिद्धांत का उल्लंघन कर रहे हैं । एक्सेल डॉक तक पहुंचने वाले वर्ग को कसकर युग्मित करने के साथ यह एक्सेल डॉक तक कैसे पहुंचता है, आप इसे "नियंत्रक" कोड (इसे उपयोग करने वाले किसी भी कोड) की क्षमता को अलग तरीके से समाप्त करते हैं। कितना अलग है, आप पूछ सकते हैं? क्या होगा यदि कंट्रोलर कोड में दो ऑपरेशन होते हैं जो एक लंबा समय लेते हैं लेकिन चाहते हैं कि वे अनुक्रमिक हों? यदि आपने नियंत्रक को थ्रेडिंग को संभालने की क्षमता की अनुमति दी है, तो यह लंबे समय तक चलने वाले कार्यों को एक साथ एक धागे में कर सकता है। क्या होगा यदि आप गैर-यूआई संदर्भ से एक्सेल डॉक्टर तक पहुंचना चाहते हैं और इसे थ्रेड करने की आवश्यकता नहीं है?

कॉलर को थ्रेडिंग की जिम्मेदारी देकर, आप अपने कोड के अधिक लचीलेपन की अनुमति देते हैं, जिससे यह अधिक पुन: प्रयोज्य हो जाता है।


2
+1 जो वास्तविक प्रश्न पूछा गया है उसका उत्तर देने के लिए और उसे अच्छी तरह से उत्तर देने के लिए।
एडम लेअर

+1 - शुक्रिया नेमी। आपने मेरे प्रश्न का उत्तर दिया, मैं इसकी सराहना करता हूं। मैं अपनी कक्षा से इसे बाहर निकालूंगा और इसे एक नई कक्षा में रखूंगा, फिर से धन्यवाद!
जेटी

@ नीमी - तो क्या यह स्वीकार्य होगा अगर मैं एक और विधि बनाऊं जो एक तुल्यकालिक भार होगा और फिर एक async विधि होगी? या यह एक तुल्यकालिक लोड विधि है और फिर वहाँ से जाने के लिए बेहतर होगा?
जेटी

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

धन्यवाद नेमी! काश मैं तुम्हें फिर से उभार सकता क्योंकि तुम निश्चित रूप से मेरे सवाल का जवाब देते और मुझे सही दिशा में इशारा करते। फिर से धन्यवाद!!
जेटी

3

पृष्ठभूमि कार्यों से अलग संचालन में UI संचालन को संचालित करना अच्छा डिजाइन है। अन्यथा अनुप्रयोग के व्यस्त होने पर UI अनुत्तरदायी हो जाता है।

यदि आप बैकग्राउंड थ्रेड में काम करने वाले हिस्से को उसकी अपनी कक्षा में अलग कर सकते हैं तो कोड क्लीनर होगा।


1
हालांकि, सही है कि मैंने उनके प्रश्न को कैसे पढ़ा, उन्हें इस बात को समझने में कोई समस्या नहीं है।
नेमी

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

0

मैं अलग-अलग वर्गों का उपयोग करके आपके UI को आपके बैकग्राउंड कार्य से अलग कर दूंगा। ऐसा करने से चिंताओं को अलग करने की प्रेरणा मिलती है। यूआई कोड और व्यावसायिक तर्क को मिश्रित नहीं किया जाना चाहिए।


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

0

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

यदि आप पुनरावृत्ति कर रहे हैं, तो आपको एक विशिष्ट क्रम में संसाधित होने वाली वस्तुओं की आवश्यकता नहीं है, इसके बजाय थ्रेडपूल का उपयोग करने पर विचार करें (या यदि आप .NET 4 पर हैं तो टास्क समानांतर लाइब्रेरी का उपयोग करें )।


आपके प्रतिक्रिया के लिए धन्येवाद। मैंने अपनी कक्षा में दो इवेंट बनाए जो प्रगति पर ट्रिगर करेंगे (मूल रूप से बैकग्राउंडवॉकर प्रगति इवेंट को लपेटना, क्योंकि बैकग्राउंडर निजी है) जो UI (प्रगति बार) को प्रगति भेजता है।
जेटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.