मैं क्या तंत्र चल रहे एक async आपरेशन किया जा सकता है रद्द करने के लिए संबंधित कोई प्रश्न है, async/इंतजार संदर्भ में बजाय एक रद्द टोकन का इंतजार है। मुझे यकीन है कि यह एक अच्छी तरह से अध्ययन किया गया डिज़ाइन निर्णय है जो भाषा की अनिवार्य प्रकृति को ध्यान में रखता है, लेकिन वास्तविक परिस्थितियों में आपके सभी एसिंक विधियों को रद्दीकरण ऑब्जेक्ट पास करना पड़ता है, कम से कम थोड़ा दर्दनाक होता है। सी # समुदाय से एक और डिजाइन विचार हैं, या प्रस्तावित रद्दीकरण तंत्र बस ठीक है? मुझे लगता है कि मुझे कुछ याद आ रही है।async/रद्द तंत्र
उत्तर
रद्द टोकन सबसे अच्छा अभ्यास है, खासकर जब अतुल्यकालिक प्रक्रिया महंगी है, कोई पूर्व निर्धारित अंत हालत है, या बाह्य संसाधनों शामिल है।
हालांकि, अगर आप चाहें तो बस "छोड़ दें"। प्रसंस्करण और साफ करने के लिए एसिंक थ्रेड को बताने के बजाय, बस "टाइम आउट"; इसे पूरा करने के लिए प्रतीक्षा करना बंद करो, किसी भी श्रोताओं को अलग करें, और दौड़ते रहें। जब धागा अंततः पूरा हो जाता है, तो यह उसकी घटना की जांच करेगा, किसी को भी नहीं सुन रहा है, और चुपचाप समाप्त हो जाएगा। उल्टा सादगी है, लेकिन कई स्थितियों जिसमें यह एक बुरी बात होगी देखते हैं:
- async प्रक्रिया प्रसंस्करण हमेशा के लिए रखना होगा, तो जब तक आप इसे बताने को रोकने के लिए, यह बांधने, पृष्ठभूमि में चल रहा रखेंगे सीपीयू और अन्य संसाधन, जब तक ऐप बंद न हो जाए, उस समय थ्रेड मारा जाएगा।
- async धागा, इस तरह के एक डीबी आपरेशन के रूप में काम का एक abortable, प्रतिवर्ती इकाई प्रदर्शन कर रहा है, तो उपयोगकर्ता प्रेस वे कुछ भी अब तक किया वापस लुढ़का दिया है की उम्मीद रद्द कर दें। यदि आप सुनना बंद कर देते हैं और आगे बढ़ते हैं, तो उन्हें क्या मिलेगा कि वे क्या सोचते हैं कि उन्होंने रद्द कर दिया था।
- ज्यादातर मामलों में, एसिंक ऑपरेशंस में बाहरी संसाधन शामिल होते हैं जो काम करने में समय लेते हैं, और उचित सफाई की भी आवश्यकता होती है। नेटवर्क सॉकेट को डिस्कनेक्ट किया जाना चाहिए, डीबी कनेक्शन बंद हो गए हैं, फाइल अनलॉक हो गई हैं, आदि। हालांकि छोड़ने का मतलब है कि आपको इससे निपटने की ज़रूरत नहीं है, बजाय थ्रेड को सामान्य रूप से समाप्त करने के बजाय, उपयोगकर्ता के लिए एक आम उपयोगकर्ता अनुभव तंग आना है, हिट करना रद्द करें और फिर ऑपरेशन का पुनः प्रयास करें। इसका मतलब है कि पिछले एसिंक ऑपरेशन में आपके द्वारा उपयोग किए जाने वाले संसाधन को फिर से उपयोग करने के लिए रिलीज़ किया जाना है।
एसिंक ऑपरेशन को रद्द करने के लिए, उस ऑपरेशन को समझदार कदम करना चाहिए, क्योंकि यह रद्दीकरण टोकन की जांच करने और खुद को जारी रखने से रोकने का ऑपरेशन है। अर्थात। रद्दीकरण टोकन केवल एक पैटर्न लागू किया जाना है जिसे एसिंक/प्रतीक्षा की व्यवस्था नहीं है।
इसका अर्थ यह है कि यदि आपका एसिंक ऑपरेशन केवल एक I/O कॉल पूरा होने वाला है, तो आप भी रद्द कर सकते हैं, क्योंकि ऑपरेशन में आपके टोकन को जांचने के लिए oppurtunity नहीं होगा वह कॉल वापस आती है जिस बिंदु पर हासिल करने के लिए कुछ भी नहीं है।
तो रद्दीकरण टोकन पर विचार करते समय, पहले विचार करें कि इस ऑपरेशन को रद्द करने के समर्थन से अधिक कुशल बनाया जा सकता है या फिर इसे पूरा करने की प्रतीक्षा नहीं कर रहा है (यानी इसके बजाय टाइमआउट तंत्र का उपयोग करके) अधिक समझ में आता है।
रद्दीकरण टोकन का उपयोग करके रद्दीकरण तंत्र Async पर सी # 5 सीटीपी सहित दिशा की दिशा में चल रहा है। http://msdn.microsoft.com/en-us/vstudio/gg316360। यह सी # 5 नहीं है लेकिन मैं इसका उपयोग सी # के "अगले" संस्करण को इंगित करने के लिए कर रहा हूं। –
बस ध्यान दिया कि आपने अपने प्रश्न में "प्रतीक्षा" का उपयोग किया है ताकि आप सीटीपी से परिचित हों। मुझे लगता है कि टास्क समांतर लाइब्रेरी (.NET 4) ने पुष्टि की है कि यह प्रदान की जाने वाली सुविधाएं जाने का तरीका था और इसलिए Async CTP समान प्रतिमान का उपयोग करता है। –
संबंधित: http://stackoverflow.com/q/4914374/60761 –