6

निम्नलिखित क्यों कानूनी हैं?CancellationToken.None के साथ पंजीकरण करना सुरक्षित है?

CancellationToken.None.Register(delegate { }); 

उदाहरण के लिए, Register यहां अपवाद क्यों नहीं फेंकता है? क्या ऐसा इसलिए है क्योंकि ऊपर की संख्या NOP है?

पृष्ठभूमि: इस सवाल पूछने के लिए कारण को समझने के लिए एक विधि एक CancellationToken जरूरतों को स्वीकार CancellationToken.None के खिलाफ रक्षा कूटबद्ध किया है कि क्या जब पंजीकरण शामिल है।

उत्तर

10

CancellationToken.None एक शून्य संदर्भ नहीं है, बल्कि एक खाली रद्दीकरण टोकन है। इस तरह, यह एक उदाहरण है। पंजीकरण कभी भी आग नहीं होगा, क्योंकि स्रोत कभी रद्द होने के रूप में पंजीकृत नहीं होगा, लेकिन यह "ठीक से" जाएगा।

मैं अभी भी इसके खिलाफ एक जांच और कोड रक्षात्मक रूप से रखूंगा, हालांकि, जब तक आप CancellationTokenRegistration को ठीक से वापस करने के बारे में सावधान नहीं हैं।


संपादित करें:

आगे की जांच पड़ताल करने पर, यदि आप CancellationToken.None के खिलाफ रजिस्टर, आप प्रभावी रूप से कुछ भी नहीं कर रही होगी, और CancellationTokenRegistration लौटे निपटान की जरूरत नहीं होगी। यह आपके ऑब्जेक्ट या प्रतिनिधि का संदर्भ नहीं रखेगा, और रिसाव नहीं बनाएगा, इसलिए यह व्यावहारिक उद्देश्यों के लिए नो-ऑप है। यह करना सुरक्षित होना चाहिए, और अपने अंत से बचने के लिए रक्षात्मक प्रथाओं की आवश्यकता नहीं होनी चाहिए।

+0

मुझे एहसास है कि रद्दीकरण टोकन एक मान प्रकार है और इसलिए हमेशा रद्द करना टोकन के साथ एक मान है। डिफ़ॉल्ट रूप से निर्मित एक के बराबर होना चाहिए। क्या आप मानते हैं, हालांकि, पंजीकरण खाली टोकन के लिए स्वयं एक एनओपी है और इसलिए कोई रक्षा की आवश्यकता नहीं है? –

+0

@ एटीआईफ़: मैं बस गया और जांच की कि वास्तव में क्या होता है - यह सुरक्षित है, और किसी भी रक्षा की आवश्यकता नहीं है। (मैंने अपना उत्तर दिखाने के लिए संपादित किया) पंजीकरण विधि में एक चेक है जो सिर्फ एक नया पंजीकरण देता है, और टोकन रद्द नहीं किया जा सकता है, तो प्रतिनिधि को पूरी तरह से अनदेखा करता है, जो सीटी नॉन के मामले में है। –

+0

दिलचस्प। मुझे वह चेक नहीं मिला जो आप उल्लेख करते हैं :), इस प्रकार मेरा प्रश्न। –

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