সাধারণ ধার্মিকতার ক্রমবর্ধমান ক্রমে এখানে কয়েকটি সমাধান রয়েছে:
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)
।