यह प्रश्न C # भाषा की चिंता करता है, लेकिन मुझे उम्मीद है कि यह जावा या टाइपस्क्रिप्ट जैसी अन्य भाषाओं को कवर करेगा।
Microsoft .NET में अतुल्यकालिक कॉल का उपयोग करने पर सर्वोत्तम प्रथाओं की सिफारिश करता है। इन सिफारिशों के बीच, चलो दो चुनें:
- Async विधियों के हस्ताक्षर बदलें ताकि वे टास्क या टास्क लौटाएँ <> (टाइपस्क्रिप्ट में, यह एक वादा होगा>>)
- xxxsync () के साथ समाप्त होने के लिए async विधियों के नाम बदलें
अब, एक async एक द्वारा एक निम्न स्तर, तुल्यकालिक घटक की जगह, यह आवेदन के पूर्ण ढेर को प्रभावित करता है। चूंकि एसिंक्स / वेट का सकारात्मक प्रभाव केवल तभी होता है जब "सभी तरह से उपयोग किया जाता है", इसका मतलब है कि आवेदन में हर परत के हस्ताक्षर और विधि के नाम को बदलना होगा।
एक अच्छी वास्तुकला में अक्सर प्रत्येक परतों के बीच सार को शामिल करना शामिल होता है, जैसे कि दूसरों द्वारा निम्न-स्तरीय घटकों को प्रतिस्थापित करना ऊपरी स्तर के घटकों द्वारा अनदेखी नहीं है। C # में, एब्स्ट्रैक्ट इंटरफेस का रूप लेते हैं। यदि हम एक नया, निम्न-स्तरीय, एसिंक्स घटक पेश करते हैं, तो कॉल स्टैक में प्रत्येक इंटरफ़ेस को एक नए इंटरफ़ेस द्वारा संशोधित या प्रतिस्थापित किया जाना चाहिए। जिस तरह से एक कार्यान्वित वर्ग में एक समस्या (async या सिंक) हल की जाती है वह कॉल करने वालों के लिए छिपी (सार) नहीं है। कॉल करने वालों को यह जानना होगा कि क्या यह सिंक या एसिंक्स है।
"अच्छा आर्किटेक्चर" सिद्धांतों के विपरीत सर्वोत्तम प्रथाओं का एसिंक्रोनस / प्रतीक्षा नहीं है?
क्या इसका मतलब है कि प्रत्येक इंटरफ़ेस (IEnumerable, IDataAccessLayer कहते हैं) को उनके async समकक्ष (IAsyncEnumerable, IAsyncDataAccessLayer) की आवश्यकता होती है, ताकि उन्हें async निर्भरता के लिए स्विच करने के बाद स्टैक में प्रतिस्थापित किया जा सके?
यदि हम समस्या को थोड़ा और बढ़ाते हैं, तो क्या यह आसान नहीं होगा कि हर विधि को async मान लिया जाए (टास्क को वापस करने के लिए <> या वादा <>), और विधियों के लिए async कॉल को सिंक्रनाइज़ करने के लिए जब वे वास्तव में नहीं हों async? क्या यह भविष्य की प्रोग्रामिंग भाषाओं से अपेक्षित है?
CancellationToken
, और जो लोग डिफ़ॉल्ट की आपूर्ति करना चाहते हैं)। मौजूदा सिंक विधियों को हटाना (और सभी कोड को लगातार तोड़ना) एक स्पष्ट गैर-स्टार्टर है।