2016-06-09 3 views
5

मैं एक बड़े डब्ल्यूपीएफ अनुप्रयोग के विकास के माध्यम से एक महत्वपूर्ण तरीका हूं जो सीरियल कॉम के माध्यम से हार्डवेयर के एक परिष्कृत टुकड़े को नियंत्रित करेगा। एप्लिकेशन के बहुत नीचे "स्टैक" पर मेरे पास एक सीरियल कॉमर्स टियर है (.NET 'SerialPort' क्लास का उपयोग करना)। एच/डब्ल्यू डिवाइस को पढ़ना और लिखना सिस्टम का एक मौलिक हिस्सा है, जो व्यवसाय तर्क स्तर के कई अलग-अलग क्षेत्रों द्वारा उपयोग किया जाता है, अक्सर जटिल वैज्ञानिक गणनाओं और अन्य ऐसे तर्कों से घिरा हुआ होता है; इन बीएलएल विधियों को बारी में यूआई स्तर पर बुलाया जाता है।क्या मुझे अपने जीयूआई ऐप के लिए "सभी तरह से" एसिंक का उपयोग करना चाहिए?

वर्तमान में, सीरियलपोर्ट पढ़ने और लिखने सहित व्यापार तर्क स्तर में सब कुछ तुल्यकालिक है। एसिंक/प्रतीक्षा का एकमात्र समय यूआई टियर में होता है, आमतौर पर जब व्यापार तर्क में कॉल किया जाता है। यहाँ मैं

private async void SomeButtonClick(object sender, EventArgs e) 
{ 
    await Task.Run(() => _someBLLService.TurnPumpOn()); 
} 

यह एक सरल उदाहरण है कि मिलीसेकेंड की बात लेता है Task.Run() में कॉल लपेट कर देंगे, e.g.:-। एक और जटिल उदाहरण एक लंबी चल रही प्रक्रिया शुरू कर देगा (फिर उपरोक्त तकनीक का उपयोग कर); यह व्यवसाय तर्क "सेवा" हार्डवेयर से डेटा एकत्रित करने और इस समय के दौरान अन्य "नियंत्रण" कार्यों को करने, कुछ सेकंड या मिनट के लिए चलाएगा। समय-समय पर यह एक चार्ट पर प्लॉट करने के लिए डेटा को UI पर वापस प्रसारित करेगा (एक पबब ईवेंट एग्रीगेटर फ्रेमवर्क के माध्यम से)। उपर्युक्त तकनीक अच्छी तरह से काम करती है, जिससे यूआई को उत्तरदायी बने रहने की इजाजत मिलती है जबकि इस तरह की व्यावसायिक स्तर की प्रक्रियाएं हो रही हैं।

मैं हाल ही में सीरियल कॉमम्स कोड (उदाहरण के लिए .ReadAsync का उपयोग करके) "एसिंक सभी तरह से" जाने पर विचार कर रहा हूं, लेकिन इस प्रणाली में इसका असर होगा। बिजनेस लॉजिक विधियों के दर्जनों (यदि सैकड़ों नहीं) को यूआई टियर तक सीधे एसिंक विधियों में दोबारा लगाने की आवश्यकता होगी। यहाँ मैं ऊपर कोड थोड़ा आसान बनाने के लिए सक्षम हो जाएगा:

private async void SomeButtonClick(object sender, EventArgs e) 
{ 
    await _someBLLService.TurnPumpOn(); 
} 

जब मैं बड़ी रिफैक्टरिंग नौकरियों से निपटने, मैं सोच रहा हूँ क्या लाभ वास्तव में कर रहे हैं के खिलाफ नहीं हूँ। बहुत से लोग (जैसे स्टीफन क्लेरी) "एसिंक सभी तरह से" समाधान का समर्थन करते हैं, लेकिन मुख्य लक्ष्य यूआई उत्तरदायी रखना है जब एक लंबी चल रही बीएलएल प्रक्रिया को कॉल करते हैं, जो मेरी Task.Run() तकनीक पहले से ही करती है।

+2

स्पष्टीकरण के लिए, "एसिंक सभी तरह से" कहने का एक और तरीका है "एसिंक कोड पर अवरुद्ध न करें" - यह केवल एक ही रास्ता है।यूआई ऐप के मामले में, एसिंक का प्राथमिक लाभ उत्तरदायित्व है, और 'टास्क की प्रतीक्षा करें। रून' एक बिल्कुल सही समाधान है यदि यह आपके लिए काम करता है। –

उत्तर

7

चूंकि आपका ऐप (संभवतः) उच्च लोड के तहत नहीं है और एक जीयूआई ऐप एसिंक का उपयोग करने का एकमात्र कारण है और उत्पादकता लाभ है। थ्रूपुट और स्केलेबिलिटी तस्वीर में प्रवेश नहीं करती है।

इसलिए, जो आपके लिए सबसे सुविधाजनक है वह करें। यह await Task.Run पैटर्न बहुत अच्छी तरह से हो सकता है जिसे आपने नमूना कोड में उपयोग किया था।

लेकिन इस प्रणाली

हाँ भर नतीजों के लिए होगा। Async एक उल्लेखनीय उत्पादकता लागत है और यह संक्रामक है। केवल तभी ऐसा करें जब आप उस विकल्प से प्राप्त लाभों को स्पष्ट रूप से स्पष्ट कर सकें। यहां, एकमात्र लाभ यह होगा कि आपका यूआई कोड कुछ वर्ण कम है। यह आपके दो कोड स्निपेट के बीच का अंतर है। सिस्टम का पूरा शेष खराब हो जाता है।

शायद आप सी # समुदाय का अनुसरण कर रहे हैं और इस तरह से एसिंक को जाने के लिए प्रवृत्ति को उठाया है। प्रोग्रामर उन्हें समझने के बिना जादू समाधान पर कूदने के लिए बहुत प्रवण हैं। एसिंक के कई समर्थक भी इससे प्राप्त ठोस लाभों को स्पष्ट नहीं कर सकते हैं। बहुत सारे समूह भी सोचते हैं। अकेले इंटरनेट सलाह पर अपने फैसले का आधार न लें। फैक्टर जो आपके लिए जांच और जांच करता है जो समझ में आता है।

+0

यह अभी एक डेस्कटॉप ऐप है, लेकिन कुछ बीएलएल विधियों का पर्दाफाश करने के लिए सिग्नलआर का उपयोग करने की योजना है, उदा। एक स्मार्टफोन क्लाइंट के लिए एच/डब्ल्यू डिवाइस (एक या दो से अधिक क्लाइंट्स) पर सीमित नियंत्रण प्रदान करने के लिए। मेरी समझ यह है कि सिग्नलआर क्लाइंट कनेक्शन को असीमित रूप से संभालती है, इसलिए संभवतः अभी भी एसिंक के लिए पर्याप्त कारण नहीं है? –

+0

सिग्नलआर आपको एक कार्य वापस करने का समर्थन करता है। यह कार्य सिर्फ "कार्य" FrResult' या "डमी" कार्य बनाने के किसी अन्य तरीके से हो सकता है। यदि कोई लोड नहीं है तो कोई पेर्फ चिंता नहीं है। सिग्नलआर * आंतरिक रूप से * कुशल सॉकेट आईओ का उपयोग करेगा और आपको इससे फायदा होगा। – usr

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

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