বাতিলকরণ টোকেনের জন্য ডিফল্ট প্যারামিটার


98

আমার কিছু অ্যাসিঙ্ক কোড রয়েছে যা আমি এতে যুক্ত করতে চাই CancellationToken। তবে, এমন অনেকগুলি বাস্তবায়ন রয়েছে যেখানে এটির প্রয়োজন নেই তাই আমি একটি ডিফল্ট প্যারামিটার রাখতে চাই - সম্ভবত CancellationToken.None। যাহোক,

Task<x> DoStuff(...., CancellationToken ct = null)

উৎপাদনের

ডিফল্ট প্যারামিটার হিসাবে '' টাইপের মানটি ব্যবহার করা যায় না কারণ 'সিস্টেম.Threading.CancellationToken' টাইপ করার জন্য কোনও মানক রূপান্তর নেই because

এবং

Task<x> DoStuff(...., CancellationToken ct = CancellationToken.None)

'সিটি' এর জন্য ডিফল্ট প্যারামিটার মানটি একটি সংকলন-সময় ধ্রুবক হতে হবে

এর জন্য কোনও ডিফল্ট মান আছে কি CancellationToken?

উত্তর:


155

দেখা যাচ্ছে যে নিম্নলিখিত কাজ করে:

Task<x> DoStuff(...., CancellationToken ct = default(CancellationToken))

... বা:

Task<x> DoStuff(...., CancellationToken ct = default) // C# 7.1 and later

যা ডকুমেন্টেশন অনুসারে ব্যাখ্যা করা হয় CancellationToken.None:

default(CancellationToken)খালি বাতিলকরণ টোকেন তৈরি করতে আপনি সি # বিবৃতিটিও ব্যবহার করতে পারেন ।


4
এটি ঠিক কি ফ্রেমওয়ার্ক বর্তমানে আছে অভ্যন্তরীণভাবে, কিন্তু আমি চাই না আমার কোডে এটা করতে। মাইক্রোসফ্ট যদি তাদের বাস্তবায়ন পরিবর্তন করে এবং এর CancellationToken.Noneচেয়ে বেশি কিছু হয়ে যায় তবে আপনার কোড দিয়ে কী ঘটে তা ভাবুন default(CancellationToken)
নাসেরটিও

10
@ নোজেরিটিও যে পিছনে সামঞ্জস্যতা একটি বড় উপায়ে ভেঙে দেবে, তাই আমি আশা করি না যে এটি ঘটবে। আর কি করবে default(CancellationToken)?
সোভিক

4
@ নোসরটিও: আপনি খুব কঠোর হচ্ছেন। সম্ভাবনা CancellationToken.Noneহ'ল সত্যই হ্রাস করা হবে। এমনকি মাইক্রোসফ্ট এর default(CancellationToken)পরিবর্তে ব্যবহার করছে । উদাহরণস্বরূপ, সত্তা ফ্রেমওয়ার্কের উত্স কোড থেকে এই অনুসন্ধানের ফলাফলগুলি দেখুন ।
drowa

21
এমএসডিএন বাতিলকরণ টোকেন.নোন সম্পত্তি থেকে : "আপনি খালি বাতিল টোকেন তৈরি করতে সি # ডিফল্ট (বাতিলকরণ টোকেন) বিবৃতিটিও ব্যবহার করতে পারেন" । সি # এর ফিউচার সংস্করণ এটিকে ডিফল্ট প্যারামিটার হিসাবে গ্রহণ না করা পর্যন্ত কোনওটিই ভুল নয়।
MuiBienCarlota

4
এখানে একই দুটি অনুপস্থিত মধ্যবর্তী সংযোগগুলির জন্য ক্ষতিপূরণ দেওয়ার জন্য, বিকাশকারীরা বাতিল টোকেন প্যারামিটারের জন্য কোনওটি বা একটি ডিফল্ট বাতিলকরণ টোকন এবং অগ্রগতি প্যারামিটারের জন্য নਾਲ পাস করতে পারে।
আরেক বাল

25

বাতিলকরণ টোকেনের জন্য কোনও ডিফল্ট মান আছে কি?

দুর্ভাগ্যক্রমে, এটি সম্ভব নয়, যেমন CancellationToken.Noneএকটি সংকলন সময় ধ্রুবক নয়, যা alচ্ছিক যুক্তিতে ডিফল্ট মানগুলির জন্য প্রয়োজনীয়।

আপনি একই প্রভাব প্রদান করতে পারেন, তবে ডিফল্ট পরামিতি ব্যবহার করার পরিবর্তে ওভারলোড পদ্ধতি তৈরি করে:

Task<x> DoStuff(...., CancellationToken ct)
{
    //...
}

Task<x> DoStuff(....)
{
    return DoStuff(...., CancellationToken.None);
}

6
এটি হ্যান্ডেল করার প্রস্তাবিত উপায়, এমএসডিএন - তে টাস্ক-ভিত্তিক অ্যাসিনক্রোনাস প্যাটার্ন ডকুমেন্টেশনে বর্ণিত হিসাবে (বিশেষত প্রদানের জন্য ওভারলোডগুলি নির্বাচন করা বিভাগে )।
স্যাম হারওয়েল

বাতিলকরণ
টোকেন.নেকে

4
কি ব্যাপার CancellationToken cancellationToken = default(CancellationToken)? এছাড়াও এখানে ব্লগস.এমএসডিএন.মাইক্রোসফট.এন্ডআর্রুয়ারনটমস
রায়

20

সাধারণ ধার্মিকতার ক্রমবর্ধমান ক্রমে এখানে কয়েকটি সমাধান রয়েছে:

1. default(CancellationToken)ডিফল্ট মান হিসাবে ব্যবহার :

Task DoAsync(CancellationToken ct = default(CancellationToken)) { … }

শব্দার্থকভাবে, ডিফল্টর CancellationToken.Noneজন্য আদর্শ প্রার্থী হবে, তবে এটি ব্যবহার করা যায় না কারণ এটি কোনও সংকলন-সময় ধ্রুবক নয়। default(CancellationToken)পরবর্তী সেরা জিনিস কারণ এটি একটি সংকলন-সময় ধ্রুবক এবং সমতুল্য হওয়ার জন্য সরকারীভাবে নথিভুক্তCancellationToken.None

২. 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);
}

এটি একটি পাতলা ইন্টারফেসে ফলাফল দেয় এবং প্রবর্তক পদ্ধতির ওভারলোডকে স্পষ্টতভাবে লেখা থেকে প্রয়োগকারীদের বাঁচায়।

৩. প্যারামিটারটিকে অযোগ্য করে তোলা nullএবং ডিফল্ট মান হিসাবে ব্যবহার করা:

Task DoAsync(…, CancellationToken? ct = null)
{
    … ct ?? CancellationToken.None …
}

আমি এই সমাধানটি কমপক্ষে পছন্দ করি কারণ নালাগুলি প্রকারগুলি একটি ছোট রানটাইম ওভারহেড সহ আসে এবং নাল কোলেসিং অপারেটরের কারণে বাতিলকরণ টোকেনের উল্লেখগুলি আরও ভার্জোজ হয় ??


11

আরেকটি বিকল্প হ'ল Nullable<CancellationToken>প্যারামিটার ব্যবহার করা, এটি ডিফল্ট করা nullএবং পদ্ধতির অভ্যন্তরে এটি মোকাবেলা করা:

Task<x> DoStuff(...., CancellationToken? ct = null) {
    var token = ct ?? CancellationToken.None;
    ...
}

উজ্জ্বল! এখন পর্যন্ত এটি সেরা উত্তর
জন হেন্কেল

6

সি # এর নতুন সংস্করণগুলি ডিফল্ট (বাতিলকরণ টোকেন) সংস্করণের জন্য একটি সরলিকৃত সিনট্যাক্সের অনুমতি দেয়। যেমন:

Task<x> DoStuff(...., CancellationToken ct = default)

-1

তোফটিমের উত্তরটি একটি উপায়, তবে আমি যে মন্তব্যগুলি দিয়ে দেখছি তাতে জনগণের কাছে সমস্যা রয়েছে।

সেক্ষেত্রে আমি পরামর্শ দিয়েছিলাম যে কারও কাছে একটি পদ্ধতি থাকতে পারে:

Task<x> DoStuff(...., CancellationToken ct)
{
} 

এবং এটিকে ওভারলোড করুন:

Task<x> DoStuff(....)
{
    return DoStuff(...., CancellationToken.None);
}

এটি সংকলন করে, কারণ CancellationToken.Noneসংকলনের সময়টির মান প্রয়োজন হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.