ValueTask<T>
का सबसेट नहीं है Task<T>
, यह एक सुपरसेट है ।
ValueTask<T>
एक T और a का एक विभेदित संघ है Task<T>
, जो इसे ReadAsync<T>
उपलब्ध मूल्य के समतुल्य रूप से T मान प्रदान करने के लिए आवंटन-मुक्त बनाता है (उपयोग करने के विपरीत Task.FromResult<T>
, जिसे एक Task<T>
उदाहरण आवंटित करने की आवश्यकता है )। ValueTask<T>
प्रतीक्षा योग्य है, इसलिए उदाहरणों की सबसे अधिक खपत एक के साथ अप्रभेद्य होगी Task<T>
।
ValueTask, एक संरचना होने के नाते, एसिंक्स विधियों को लिखने में सक्षम बनाता है जो मेमोरी को आवंटित नहीं करते हैं जब वे एपीआई संगतता से समझौता किए बिना सिंक्रनाइज़ करते हैं। एक टास्क रिटर्निंग विधि के साथ एक इंटरफ़ेस होने की कल्पना करें। इस इंटरफ़ेस को लागू करने वाले प्रत्येक वर्ग को एक टास्क वापस करना होगा, भले ही वे सिंक्रोनाइज़ करने के लिए हों (उम्मीद है कि Task.FromResult का उपयोग करके)। आप निश्चित रूप से इंटरफ़ेस पर 2 अलग-अलग तरीके, एक तुल्यकालिक एक और एक async एक कर सकते हैं लेकिन इसके लिए "सिंक पर सिंक" और "सिंक पर सिंक" से बचने के लिए 2 अलग-अलग कार्यान्वयन की आवश्यकता होती है।
तो यह आपको एक विधि लिखने की अनुमति देता है जो या तो अतुल्यकालिक या तुल्यकालिक है, बल्कि फिर प्रत्येक के लिए एक अन्यथा समान विधि लिखना है। आप इसे कहीं भी उपयोग कर सकते हैं, Task<T>
लेकिन यह अक्सर कुछ भी नहीं जोड़ रहा है।
खैर, यह एक बात जोड़ता है: यह कॉलर को एक निहित वादा जोड़ता है कि विधि वास्तव में ValueTask<T>
प्रदान करने वाली अतिरिक्त कार्यक्षमता का उपयोग करती है। मैं व्यक्तिगत रूप से पैरामीटर और रिटर्न प्रकार चुनना पसंद करता हूं जो कॉलर को जितना संभव हो उतना बता सकता है। IList<T>
यदि गणना गणना प्रदान नहीं कर सकती है, तो वापस न करें ; IEnumerable<T>
अगर यह कर सकते हैं तो वापस न करें । आपके उपभोक्ताओं को यह जानने के लिए कोई दस्तावेज़ नहीं देखना चाहिए कि आपके कौन से तरीके यथोचित रूप से समकालिक कहे जा सकते हैं और कौन से नहीं।
मैं भविष्य के डिजाइन परिवर्तनों को एक ठोस तर्क के रूप में नहीं देखता। इसके विपरीत: यदि कोई विधि अपने शब्दार्थ को बदल देती है, तो उसे बिल्ड को तब तक तोड़ना चाहिए जब तक कि उसके अनुसार सभी कॉल अपडेट न हो जाएं। यदि इसे अवांछनीय माना जाता है (और मेरा विश्वास करो, मैं निर्माण को नहीं तोड़ने की इच्छा के लिए सहानुभूति रखता हूं), इंटरफ़ेस संस्करण पर विचार करें।
यह अनिवार्य रूप से मजबूत टाइपिंग के लिए है।
यदि आपकी दुकान में एसिंक्स विधियों को डिजाइन करने वाले कुछ प्रोग्रामर सूचित निर्णय लेने में सक्षम नहीं हैं, तो यह उन कम अनुभवी प्रोग्रामरों में से प्रत्येक के लिए एक वरिष्ठ संरक्षक को नियुक्त करने और साप्ताहिक कोड समीक्षा करने में मददगार हो सकता है। यदि वे गलत अनुमान लगाते हैं, तो समझाएं कि इसे अलग तरीके से क्यों किया जाना चाहिए। यह वरिष्ठ लोगों के लिए ओवरहेड है, लेकिन यह जूनियर्स को बहुत तेजी से गति देने के लिए लाएगा, बस उन्हें गहरे अंत में टॉस करने और उन्हें पालन करने के लिए कुछ मनमाना नियम देगा।
अगर विधि लिखने वाला आदमी यह नहीं जानता कि क्या इसे सिंक्रोनाइज़ कहा जा सकता है, तो पृथ्वी पर कौन है ?!
यदि आपके पास बहुत से अनुभवहीन प्रोग्रामर हैं जो async विधियाँ लिखते हैं, तो क्या वही लोग उन्हें भी बुला रहे हैं? क्या वे खुद के लिए यह पता लगाने के लिए योग्य हैं कि कौन से लोग एसिंक्स को कॉल करने के लिए सुरक्षित हैं, या क्या वे इसी तरह के मनमाने नियम को लागू करना शुरू कर देंगे कि वे इन चीजों को कैसे कहते हैं?
यहाँ समस्या आपकी वापसी प्रकारों की नहीं है, यह प्रोग्रामर की भूमिका में डाले जा रहे हैं जो वे तैयार नहीं हैं। यह एक कारण से हुआ होगा, इसलिए मुझे यकीन है कि इसे ठीक करने के लिए तुच्छ नहीं किया जा सकता है। इसका वर्णन निश्चित रूप से एक समाधान नहीं है। लेकिन संकलक के अतीत की समस्या को हल करने के लिए एक रास्ता की तलाश एक समाधान भी नहीं है।
ValueTask<T>
(आवंटन के संदर्भ में) के संचालन कर रहे हैं के लिए सफल नहीं वास्तव में अतुल्यकालिक (क्योंकि उस मामले मेंValueTask<T>
अभी भी ढेर आवंटन आवश्यकता होगी)।Task<T>
पुस्तकालयों के भीतर बहुत सारे अन्य समर्थन होने की बात भी है ।