सामान्य भलाई के अवरोही क्रम में, यहाँ कई समाधान हैं:
1. default(CancellationToken)
डिफ़ॉल्ट मान के रूप में उपयोग करना :
Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
शब्दार्थ, CancellationToken.None
डिफ़ॉल्ट के लिए आदर्श उम्मीदवार होगा, लेकिन इसका उपयोग इस तरह नहीं किया जा सकता क्योंकि यह संकलन-समय स्थिर नहीं है। default(CancellationToken)
यह अगली सबसे अच्छी बात है क्योंकि यह एक संकलन-समय स्थिर है और आधिकारिक तौर पर इसके समकक्ष होने के लिए प्रलेखित हैCancellationToken.None
।
2. बिना एक विधि अधिभार प्रदान करना a CancellationToken
पैरामीटर के :
या, यदि आप वैकल्पिक मापदंडों पर विधि अधिभार पसंद करते हैं ( यह और उस विषय पर यह प्रश्न देखें ):
Task DoAsync(CancellationToken ct) { … } // actual method always requires a token
Task DoAsync() => DoAsync(CancellationToken.None); // overload producing a default token
इंटरफ़ेस विधियों के लिए, एक्सटेंशन विधियों का उपयोग करके समान प्राप्त किया जा सकता है:
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
यह एक स्लिमर इंटरफ़ेस में परिणाम करता है और कार्यान्वयनकर्ताओं को अग्रेषण विधि अधिभार को स्पष्ट रूप से लिखने से रोकता है।
3. पैरामीटर को अशक्त बनाना और null
डिफ़ॉल्ट मान के रूप में उपयोग करना :
Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
मुझे यह समाधान कम से कम पसंद है क्योंकि अशक्त प्रकार एक छोटे रनटाइम ओवरहेड के साथ आते हैं, और निरस्त टोकन के संदर्भ में अशक्त सहकर्मी ऑपरेटर के कारण अधिक क्रिया हो जाते हैं ??
।
CancellationToken.None
कुछ अधिक हो गया तो आपके कोड के साथ क्या होगाdefault(CancellationToken)
।