কেন বাতিলকরণ টোকেন বাতিলকরণ টোকেনসোর্স থেকে আলাদা?


136

আমি .NET CancellationTokenস্ট্রাক্ট CancellationTokenSourceক্লাস ছাড়াও কেন চালু হয়েছিল তার যৌক্তিকতা খুঁজছি । আমি বুঝতে পারি যে কীভাবে এপিআই ব্যবহার করা হবে, তবে কেন এটি সেভাবে ডিজাইন করা হয়েছে তাও বুঝতে চাই ।

অর্থাৎ, আমাদের কী আছে:

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts.Token);

...
public void SomeCancellableOperation(CancellationToken token) {
    ...
    token.ThrowIfCancellationRequested();
    ...
}

পরিবর্তে সরাসরি CancellationTokenSourceমত কাছাকাছি পাস :

var cts = new CancellationTokenSource();
SomeCancellableOperation(cts);

...
public void SomeCancellableOperation(CancellationTokenSource cts) {
    ...
    cts.ThrowIfCancellationRequested();
    ...
}

টোকেনটি পাশ কাটিয়ে যাওয়ার চেয়ে বাতিলকরণ রাষ্ট্রের চেকগুলি আরও ঘন ঘন ঘটে যায় এই তথ্যের ভিত্তিতে এটি কি পারফরম্যান্স অপটিমাইজেশন?

সুতরাং এটি CancellationTokenSourceট্র্যাক রাখতে এবং আপডেট করতে পারে CancellationTokensএবং প্রতিটি টোকেনের জন্য বাতিলকরণ চেকটি কি কোনও স্থানীয় ক্ষেত্রের প্রবেশাধিকার?

উভয় ক্ষেত্রেই লকিংয়ের সাথে অস্থির একটি বিল যথেষ্ট কিনা তা এখনও কেন দ্রুত হবে তা আমি এখনও দেখতে পাচ্ছি না।

ধন্যবাদ!

উত্তর:


109

আমি এই ক্লাসগুলির নকশা এবং প্রয়োগের সাথে জড়িত ছিলাম।

সংক্ষিপ্ত উত্তরটি " উদ্বেগের বিচ্ছেদ "। এটি বেশ সত্য যে বাস্তবায়নের বিভিন্ন কৌশল রয়েছে এবং কিছু কিছু অন্তত টাইপ সিস্টেম এবং প্রাথমিক শিক্ষার বিষয়ে সহজ। যাইহোক, সিটিএস এবং সিটি একটি দুর্দান্ত অনেক পরিস্থিতিতে (যেমন গভীর গ্রন্থাগার স্ট্যাকস, সমান্তরাল গণনা, অ্যাসিঙ্ক, ইত্যাদি) ব্যবহারের জন্য তৈরি এবং এইভাবে অনেক জটিল ব্যবহারের বিষয়টি মাথায় রেখে নকশা করা হয়েছিল। এটি এমন নকশা যা সফল নিদর্শনগুলিকে উত্সাহিত করতে এবং পারফরম্যান্সের ত্যাগ ছাড়াই অ্যান্টি-প্যাটার্নগুলিকে নিরুৎসাহিত করে।

যদি এপিআইগুলিকে দুর্ব্যবহারের জন্য দরজাটি খোলা রাখা হয়, তবে বাতিলকরণ নকশার কার্যকারিতাটি দ্রুত ক্ষয় হতে পারে।

CancellationTokenSource == "বাতিলকরণ ট্রিগার", সংযুক্ত শ্রোতা উত্পন্ন করে

CancellationToken == "বাতিল শ্রোতা"


7
অনেক ধন্যবাদ! ভিতরে জ্ঞান সত্যই প্রশংসা করা হয়।
আন্দ্রে তারানসভ

stackoverflow.com/questions/39077497/… আপনার কি ধারণা আছে যে স্ট্রিমসকেটের ইনপুটস্ট্রিমের জন্য ডিফল্ট টাইমআউট হওয়া উচিত? আমি যখন রিডিং অপারেশন বাতিল করতে বাতিলকরণ টোকেন ব্যবহার করি তখন এটি সম্পর্কিত সকেটটি বন্ধ করে দেয়। এই সমস্যাটি কাটিয়ে উঠতে কোনও উপায় থাকতে পারে?
sam18

@ মাইক - শুধু কৌতূহল: আপনি কীভাবে কোনও সিটি-তে সিটিএসে থ্রোআইফস্যানসেলেশন রিলেকাস্টেড () এর মতো কিছু বলতে পারবেন না?
rory.ap

তাদের বিভিন্ন দায়িত্ব রয়েছে এবং এটি সিটিএস লেখার পক্ষে খুব ভার্চুয়াল নয় ok টোকেন.ট্রোআইফক্যান্সেলেশন রিসার্চড () তাই আমরা সরাসরি সিটিএসে শ্রোতা এপিআই যুক্ত করি নি।
মাইক লিডেল

@ মাইক কেন বাতিলকরণ টোকেন একটি কাঠামো এবং শ্রেণি নয়? আমি কোনও পারফরম্যান্স সুবিধা দেখতে পাচ্ছি না
Neir0

85

আমার সঠিক প্রশ্ন ছিল এবং আমি এই নকশার পিছনে যুক্তি বুঝতে চাইছিলাম।

গৃহীত উত্তরটি সঠিক যুক্তি পেয়েছে। এই বৈশিষ্ট্যটি (জোর দেওয়া খনি) ডিজাইনকারী দলের পক্ষ থেকে নিশ্চিতকরণ এখানে দেওয়া হয়েছে:

দুটি নতুন ধরণের কাঠামোর ভিত্তি গঠন করে: A একটি কাঠামো CancellationTokenযা 'বাতিল করার সম্ভাব্য অনুরোধ' উপস্থাপন করে। এই স্ট্রাক্টটি প্যারামিটার হিসাবে পদ্ধতি কলগুলিতে প্রেরণ করা হয় এবং পদ্ধতিটি এটিতে পোল করতে বা বাতিলকরণের অনুরোধ করা হলে বরখাস্ত করার জন্য একটি কলব্যাক নিবন্ধন করতে পারে। এ CancellationTokenSourceহ'ল একটি শ্রেণি যা বাতিলকরণের অনুরোধ শুরু করার জন্য প্রক্রিয়া সরবরাহ করে এবং এর সাথে Token সম্পর্কিত টোকেন পাওয়ার জন্য সম্পত্তি রয়েছে । এই দুটি ক্লাসকে একটিতে একত্রিত করা প্রাকৃতিক হত, তবে এই নকশাটি দুটি মূল ক্রিয়াকলাপ (বাতিলকরণের অনুরোধের বনাম বনাম পর্যবেক্ষণ এবং প্রত্যাহার করার জন্য) পরিষ্কারভাবে আলাদা করতে দেয়। বিশেষত, যে পদ্ধতিগুলিতে কেবলমাত্র একটি CancellationTokenগ্রহণযোগ্যতাগুলি বাতিলকরণের অনুরোধ পর্যবেক্ষণ করতে পারে তবে তা আরম্ভ করতে পারে না।

লিঙ্ক:। নেট 4 বাতিলকরণ ফ্রেমওয়ার্ক

আমার মতে, এই ঘটনাটি CancellationTokenকেবলমাত্র রাষ্ট্র পর্যবেক্ষণ করতে পারে এবং এটি পরিবর্তন করতে পারে না, এটি অত্যন্ত সমালোচনামূলক। আপনি একটি মিছরির মতো টোকেন তুলে দিতে পারেন এবং কখনই চিন্তা করবেন না যে আপনার ব্যতীত অন্য কেউ এটি বাতিল করে দেবে। এটি আপনাকে প্রতিকূল তৃতীয় পক্ষের কোড থেকে রক্ষা করে। হ্যাঁ, সম্ভাবনাগুলি পাতলা, তবে আমি ব্যক্তিগতভাবে সেই গ্যারান্টিটি পছন্দ করি।

আমি এটিও অনুভব করি যে এটি এপিআই পরিষ্কার করে তোলে এবং দুর্ঘটনাজনিত ভুল এড়ায় এবং আরও ভাল উপাদান ডিজাইনের প্রচার করে।

আসুন এই ক্লাস উভয়ের জন্য পাবলিক এপিআই দেখুন।

বাতিলকরণ টোকেন এপিআই

বাতিলকরণ টোকেনসোর্স API

আপনি যদি তাদের একত্রিত করতে চান, লংআরনিং ফাংশন লেখার সময়, আমি 'বাতিল' এর একাধিক ওভারলোডের মতো পদ্ধতি দেখতে পাব যা আমার ব্যবহার করা উচিত নয়। ব্যক্তিগতভাবে, আমি ডিসপোজ পদ্ধতিটিও দেখতে ঘৃণা করি।

আমি মনে করি বর্তমান বর্গ নকশা 'সাফল্যের গর্ত' দর্শনের অনুসরণ করে, এটি বিকাশকারীদের আরও ভাল উপাদান তৈরি করতে গাইড করে যা Taskবাতিলকরণ পরিচালনা করতে পারে এবং তারপরে জটিল কার্যপ্রবাহ তৈরির জন্য অসংখ্য উপায়ে তাদের একত্রিত করে।

আমাকে একটি প্রশ্ন জিজ্ঞাসা করি, আপনি কি ভেবে দেখেছেন টোকেনের উদ্দেশ্য কী? রেজিস্টার? এটি আমার কাছে কোনও অর্থবহ হয়নি। এবং তারপরে আমি ম্যানেজড থ্রেডে বাতিলকরণ পড়েছি এবং সবকিছু স্ফটিক স্পষ্ট হয়ে উঠেছে।

আমি বিশ্বাস করি যে টিপিএলে বাতিলকরণ ফ্রেমওয়ার্ক ডিজাইনটি একেবারে শীর্ষে not


2
যদি আপনি আশ্চর্য হয়ে থাকেন যে কীভাবে CancellationTokenSourceএটি সম্পর্কিত টোকেনের সাথে বাতিলকরণের অনুরোধটি আসলে শুরু করতে পারে (টোকেন নিজেই এটি করতে পারে না): বাতিলকরণ টোকেনের এই অভ্যন্তরীণ নির্মাতা রয়েছে: internal CancellationToken(CancellationTokenSource source) { this.m_source = source; }এবং এই সম্পত্তি: public bool IsCancellationRequested { get { return this.m_source != null && this.m_source.IsCancellationRequested; } }বাতিলকরণ টোকেনসোর্সটি অভ্যন্তরীণ নির্মাতা ব্যবহার করে, তাই টোকেনটির সাথে উল্লেখ রয়েছে উত্স (এম_সোর্স)
chviLadislav

65

এগুলি প্রযুক্তিগত কারণে নয় বরং শব্দার্থক কারণে পৃথক। আপনি যদি CancellationTokenআইএলএসপিএসের আওতায় বাস্তবায়নটি লক্ষ্য করেন তবে আপনি দেখতে পাবেন এটি কেবল একটি মোড়কের চারপাশে রয়েছে CancellationTokenSource(এবং এইভাবে কোনও রেফারেন্সের পাশ দিয়ে যাওয়ার চেয়ে আলাদা পারফরম্যান্সের ভিত্তিতে নয়)।

জিনিসগুলিকে আরও অনুমানযোগ্য করে তুলতে তারা এই কার্যকারিতার এই বিভাজন সরবরাহ করে: আপনি যখন কোনও পদ্ধতি পাস করেন CancellationToken, আপনি জানেন যে আপনি এখনও কেবল এটিই বাতিল করতে পারেন। অবশ্যই, পদ্ধতিটি এখনও একটি নিক্ষেপ করতে পারে TaskCancelledExceptionতবে CancellationTokenনিজেই - এবং একই টোকেনটি উল্লেখ করে অন্য কোনও পদ্ধতি নিরাপদ থাকবে।


ধন্যবাদ! আমার জ্বলজ্বলে প্রতিক্রিয়া হ'ল, শব্দার্থভাবে, এটি আইরিডঅনলিলিস্ট সরবরাহের সমতুল্য, এটি একটি প্রশ্নযুক্ত পন্থা। এটি খুব প্রশ্রয়জনক শোনায়, যদিও আপনার উত্তরটি গ্রহণ করে accepting
আন্দ্রে তারানসোভ

1
আরও চিন্তাভাবনা করার পরে, আমি নিজেকে আবিষ্কারককে প্রশ্নবিদ্ধ করতে দেখি। তাহলে কি বাতিল করা টোকেনসোর্স বাস্তবায়িত করবে আইস্যানসেলিলেশন টোকেন ইন্টারফেসটি প্রদান করার জন্য এটি আরও অর্থবোধ করে না? আমি .NET দল থেকে কেউ ইচ্ছুক ঐকতান হবে।
আন্দ্রে Tarantsov

এটি এখনও একটি কৌতুকপূর্ণ প্রোগ্রামারকে কাস্টিংয়ের ফলাফল হতে পারে CancellationTokenSource। আপনি মনে করতে পারেন যে আপনি কেবল "এটি করবেন না" বলতে পারেন, তবে লোকেরা (আমাকে সহ!) কিছু লুকানো কার্যকারিতা পেতে মাঝে মাঝে এই কাজগুলি করে, এবং এটি ঘটতে পারে। এটি আমার বর্তমান তত্ত্ব, কমপক্ষে।
কোরি নেলসন

1
এটি সিকিউরিটি-সম্পর্কিত না হলে বেশিরভাগ ক্ষেত্রে আপনি এপিআই ডিজাইন করেন না। আমি বরং আরও কিছু ব্যাখ্যা দিয়েছি, যেমন "ভবিষ্যতে পারফরম্যান্স অপ্টিমাইজেশনের জন্য তাদের বিকল্পগুলি খোলা রাখা"। তবে এখনও, আপনার এখন পর্যন্ত সেরা।
আন্দ্রে তারানটসভ 9'13

আরে, আমি আশা করি আপনি আমাকে প্রয়োগের সাথে জড়িত ব্যক্তির গ্রহণযোগ্য উত্তর পুনরায় বরাদ্দ করতে ক্ষমা করবেন। আপনি উভয়ই একই কথা বলার পরে, আমি মনে করি এসও এর যথাযথ উত্তর শীর্ষে রয়েছে from
আন্দ্রে তারানসোভ

10

এটি CancellationTokenএমন একটি কাঠামো যাতে পদ্ধতিগুলির সাথে পাশ করার কারণে অনেকগুলি অনুলিপি থাকতে পারে।

CancellationTokenSourceসেট একটি টোকেন সমস্ত অনুলিপি যখন কলিং রাষ্ট্র Cancelউৎস উপর। এই এমএসডিএন পৃষ্ঠাটি দেখুন

নকশার কারণ হতে পারে উদ্বেগ এবং কাঠামোর গতি আলাদা করার বিষয়টি।


1
ধন্যবাদ। মনে রাখবেন যে অন্য একটি উত্তর প্রযুক্তিগতভাবে (আইএল) বলে, বাতিলকরণ টোকেনসোর্স টোকেনের অবস্থা সেট করে না; পরিবর্তে, টোকেনগুলি বাতিল টোকেনসোর্সে একটি প্রকৃত রেফারেন্স মোড়ান এবং বাতিলকরণের জন্য এটি পরীক্ষা করতে কেবল এটিকে অ্যাক্সেস করুন। যদি কিছু হয় তবে গতিটি এখানে কেবল হারিয়ে যেতে পারে।
আন্দ্রে তারানসোভ

+1 টি। আমি বুঝতে পারছি না। যদি এটির মান ধরণ থাকে তাই প্রতিটি পদ্ধতির নিজস্ব মান (পৃথক মান) থাকে। সুতরাং একটি পদ্ধতিটি কীভাবে জানতে পারে যে বাতিল বলা হয়েছে কিনা? এটির টোকনসোর্সের কোনও উল্লেখ নেই। সমস্ত পদ্ধতি দেখতে পারে "5" এর মতো স্থানীয় মানের ধরণ। তুমি কি ব্যাখ্যা করতে পারো ?
রই নমির

1
@ রইনিমির: প্রতিটি বাতিলকরণ টোকেনের ব্যক্তিগত রেফারেন্স রয়েছে "এম_সোর্স" টাইপ বাতিলকরণ
টোকেনসোর্স

2

CancellationTokenSource'জিনিস' যে বিষয় বাতিলের কারনের জন্য। এটি 'প্রেরণ' করার একটি উপায় দরকার যা CancellationTokenএটি ইস্যু করেছে এমন সকলের কাছে বাতিল । উদাহরণস্বরূপ, কোনও অনুরোধ বাতিল হয়ে গেলে এএসপি.এনইটি অপারেশন বাতিল করতে পারে। প্রতিটি অনুরোধের একটি রয়েছে CancellationTokenSourceযা এটি ইস্যু করা সমস্ত টোকেনগুলিতে বাতিলকরণ ফরওয়ার্ড করে।

বিটিডব্লিউ ইউনিট পরীক্ষার জন্য এটি দুর্দান্ত - আপনার নিজস্ব বাতিলকরণ টোকেন উত্স তৈরি করুন, একটি টোকেন পান, উত্সটিতে কল Cancelকরুন এবং টোকেনটি আপনার কোডটিতে পাস করুন যা বাতিলকরণ পরিচালনা করতে হবে।


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