मैं एक बड़े डब्ल्यूपीएफ अनुप्रयोग के विकास के माध्यम से एक महत्वपूर्ण तरीका हूं जो सीरियल कॉम के माध्यम से हार्डवेयर के एक परिष्कृत टुकड़े को नियंत्रित करेगा। एप्लिकेशन के बहुत नीचे "स्टैक" पर मेरे पास एक सीरियल कॉमर्स टियर है (.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()
तकनीक पहले से ही करती है।
स्पष्टीकरण के लिए, "एसिंक सभी तरह से" कहने का एक और तरीका है "एसिंक कोड पर अवरुद्ध न करें" - यह केवल एक ही रास्ता है।यूआई ऐप के मामले में, एसिंक का प्राथमिक लाभ उत्तरदायित्व है, और 'टास्क की प्रतीक्षा करें। रून' एक बिल्कुल सही समाधान है यदि यह आपके लिए काम करता है। –