সাধারণ ধার্মিকতার ক্রমবর্ধমান ক্রমে এখানে কয়েকটি সমাধান রয়েছে:
1. default(CancellationToken)ডিফল্ট মান হিসাবে ব্যবহার :
Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }
শব্দার্থকভাবে, ডিফল্টর CancellationToken.Noneজন্য আদর্শ প্রার্থী হবে, তবে এটি ব্যবহার করা যায় না কারণ এটি কোনও সংকলন-সময় ধ্রুবক নয়। default(CancellationToken)পরবর্তী সেরা জিনিস কারণ এটি একটি সংকলন-সময় ধ্রুবক এবং সমতুল্য হওয়ার জন্য সরকারীভাবে নথিভুক্তCancellationToken.None ।
২. CancellationTokenপ্যারামিটার ছাড়াই একটি পদ্ধতি ওভারলোড সরবরাহ করা:
অথবা, যদি আপনি বিকল্প পরামিতিগুলির উপর পদ্ধতির ওভারলোডগুলি পছন্দ করেন ( এটি এবং এই বিষয়ে এই প্রশ্নটি দেখুন):
Task DoAsync(CancellationToken ct) { … }
Task DoAsync() => DoAsync(CancellationToken.None);
ইন্টারফেস পদ্ধতির জন্য, এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে এটি অর্জন করা যেতে পারে:
interface IFoo
{
Task DoAsync(CancellationToken ct);
}
static class Foo
{
public static Task DoAsync(this IFoo foo) => foo.DoAsync(CancellationToken.None);
}
এটি একটি পাতলা ইন্টারফেসে ফলাফল দেয় এবং প্রবর্তক পদ্ধতির ওভারলোডকে স্পষ্টতভাবে লেখা থেকে প্রয়োগকারীদের বাঁচায়।
৩. প্যারামিটারটিকে অযোগ্য করে তোলা nullএবং ডিফল্ট মান হিসাবে ব্যবহার করা:
Task DoAsync(…, CancellationToken? ct = null)
{
… ct ?? CancellationToken.None …
}
আমি এই সমাধানটি কমপক্ষে পছন্দ করি কারণ নালাগুলি প্রকারগুলি একটি ছোট রানটাইম ওভারহেড সহ আসে এবং নাল কোলেসিং অপারেটরের কারণে বাতিলকরণ টোকেনের উল্লেখগুলি আরও ভার্জোজ হয় ??।
CancellationToken.Noneচেয়ে বেশি কিছু হয়ে যায় তবে আপনার কোড দিয়ে কী ঘটে তা ভাবুনdefault(CancellationToken)।