সি # কেন আপনাকে ওভাররাইড async তৈরি করার অনুমতি দেয়?


16

সি # তে, আপনি যখন কোনও পদ্ধতিকে ওভাররাইড করেন, মূল পদ্ধতিটি ছিল না তখন ওভাররাইড অ্যাসিঙ্ক করার অনুমতি দেওয়া হয়। এটিকে খারাপ রূপ বলে মনে হচ্ছে।

আমার কাছে যে উদাহরণটি এনেছিল তা হ'ল - আমাকে একটি লোড পরীক্ষার সমস্যার সাথে সহায়তা করার জন্য আনা হয়েছিল। প্রায় 500 একযোগে ব্যবহারকারী, লগইন প্রক্রিয়া একটি পুনর্নির্দেশ লুপে ভেঙে যায়। আইআইএস "অ্যাসিক্রোনাস অপারেশন এখনও বিচারাধীন থাকা অবস্থায় একটি অ্যাসিক্রোনাস মডিউল বা হ্যান্ডলার সম্পন্ন হয়েছে" বার্তাটি দিয়ে ব্যতিক্রম লগ করছিল। কিছু অনুসন্ধান আমাকে ভাবতে বাধ্য করেছিল যে কেউ আপত্তি করছে async void, কিন্তু উত্সের মাধ্যমে আমার দ্রুত অনুসন্ধানগুলি কিছুই খুঁজে পায় না।

দুঃখের বিষয়, যখন আমি 'অ্যাসিঙ্কস [টি]] এর মতো আরও কিছু সন্ধান করা উচিত ছিল তখন আমি' async \ svoid '(রেজেক্স অনুসন্ধান) সন্ধান করছিলাম (ধরে নিলাম টাস্ক পুরোপুরি যোগ্য ছিল না ... ধরে নেওয়া উচিত)।

আমি পরে যা পেয়েছি তা async override void onActionExecuting(...বেস কন্ট্রোলারে ছিল। স্পষ্টতই সমস্যাটি ছিল এবং এটি ছিল। এটি স্থির করে (মুহুর্তের জন্য এটি সিঙ্ক্রোনাস করে) সমস্যার সমাধান করে।

প্রশ্নে ফিরে যান: আহা কেন যখন কলিং কোডটি কখনই অপেক্ষা না করতে পারে তখন আপনি কেন একটি ওভাররাইডকে async হিসাবে চিহ্নিত করতে পারেন?



ওভাররাইড পদ্ধতিটির জন্য অপেক্ষা করতে একজন কলকারীকে ঠিক কীভাবে বাধা দেয়? আমি কোনও বাধা দেখছি না।
মার্টিন মাট

@ মার্টিনম্যাট আপনি কেবল সেই পদ্ধতিগুলির জন্য অপেক্ষা করতে পারেন যা ফিরে আসে Task
ডেরেক এলকিনস এসই

সম্ভবত এটি একটি সূক্ষ্ম বিন্দু আমি খেয়াল করেনি। আমাকে যাচাই করতে হবে, তবে আমি অপেক্ষা না করে অ-অ্যাসিঙ্ক পদ্ধতিগুলি গ্রহণের বিষয়ে ভিএস সতর্কতাটি মনে করি না।
পিটার টি। ল্যাকম্ব জুনিয়র

উত্তর:


16

ASYNC শব্দ পারবেন পদ্ধতি ব্যবহার করতে awaitএর সংজ্ঞা মধ্যে বাক্য গঠন। আমি awaitযে কোনও পদ্ধতিতে Taskএটি কোনও অ্যাসিঙ্ক পদ্ধতি কিনা তা বিবেচনা না করেই কোনও ধরণের প্রত্যাবর্তন করতে পারি।

voidঅ্যাসিঙ্ক পদ্ধতির জন্য আইনী ( নিরুৎসাহিত হলেও ) রিটার্নের ধরণ, তবে কেন এটি অনুমোদিত হবে না? বাইরে থেকে, আপনি asyncএটি না করে কিছুই করতে সক্ষম হচ্ছেন না। আপনি যে পদ্ধতিতে সমস্যায় পড়েছেন তা async না হয়ে ঠিক একই আচরণ করার জন্য লেখা যেতে পারে। এর সংজ্ঞাটি আরও ভার্জোজ হত।

কলারের করার জন্য, একটি async Tপদ্ধতি একটি স্বাভাবিক পদ্ধতি যা আয় হয় T(যা সীমাবদ্ধ void, Taskঅথবা Task<A>)। এটি একটি অ্যাসিঙ্ক পদ্ধতিটি ইন্টারফেসের অংশ নয়। লক্ষ্য করুন যে নিম্নলিখিত কোডটি অবৈধ:

interface IFoo {
    async void Bar();
}

এটি (বা বিমূর্ত শ্রেণীর অনুরূপ কোড) ভিএস ২০১২ এ নিম্নলিখিত ত্রুটি বার্তাটি সরবরাহ করে:

'অ্যাসিঙ্ক' পরিবর্তনকারী কেবলমাত্র সেই পদ্ধতিতে ব্যবহার করা যেতে পারে যার বিবৃতি বডি রয়েছে statement

যদি আমি করেনি একটি ইন্টারফেস বা অভিভাবক ক্লাসে একটি পদ্ধতি মনস্থ করা সাধারণত অ্যাসিঙ্ক্রোনাস হতে, আমি ব্যবহার করতে পারবেন না asyncযে যোগাযোগ করতে। যদি আমি এটি awaitসিনট্যাক্সের সাথে বাস্তবায়ন করতে চাইতাম তবে আমার অ্যাসিঙ্ক ওভাররাইড পদ্ধতিগুলি (প্যারেন্ট ক্লাসের ক্ষেত্রে) সক্ষম হওয়া দরকার।


1
আপনি মোটেও উল্লেখ করবেন না override, তবে এটাই প্রশ্নটি।
নাথন টগি

5
@ নাথানটুগি উত্তরের পুরো বিষয়টিটি হ'ল asyncকোনও পদ্ধতির ইন্টারফেস পরিবর্তন করে না, কেবল সংজ্ঞা অনুসারে এর সংজ্ঞা অনুসারে মঞ্জুরিপ্রাপ্ত, তাই এটি কোনও ওভাররাইড হোক বা না হোক সম্পূর্ণ অপ্রাসঙ্গিক।
ডেরেক এলকিন্স এসই

1
সবাই ইতিমধ্যে প্রাসঙ্গিক সবকিছু জানেন বলে ধরে নেওয়ার পরিবর্তে দয়া করে এটি ব্যাখ্যা করুন ।
নাথন টগি

2
@ নাথানটগি আমার মনে হয় আমি এটি ব্যাখ্যা করেছি have আপনি কি বিভ্রান্ত হয়ে পড়েছেন বা অন্য কোনও বিভ্রান্ত ব্যক্তি জিজ্ঞাসা করতে পারেন এমন কোনও নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করতে পারেন? আমি যুক্ত করতে কেবলমাত্র ভাবতে পারি তা উল্লেখ করা যে asyncপরিবর্তকটি কেবল প্রয়োগের ক্ষেত্রে প্রয়োগ করা যেতে পারে। আপনি কোনও ইন্টারফেসে কোনও পদ্ধতি async ঘোষণা করতে পারবেন না, উদাহরণস্বরূপ, কোনও পদ্ধতিটি অ্যাসিঙ্ক হয় কি না তা ইন্টারফেসের অংশ নয় কিনা তা বোঝাচ্ছেন।
ডেরেক এলকিনস এসই

5
উত্তরে ব্যাখ্যাটি রাখুন , আমি বলতে চাইছি। দীর্ঘমেয়াদে মন্তব্যগুলি এটাই নয়।
নাথান টগি

10

অ্যাসিঙ্ক কীওয়ার্ডের একমাত্র উদ্দেশ্য that ফাংশনটির মূল অংশে একটি কীওয়ার্ডের জন্য অপেক্ষা করা। এটির প্রয়োজন যাতে অপেক্ষার কার্যকারিতা যুক্ত করা বিদ্যমান কোডটি ভেঙে না ফেলে। মাইক্রোসফ্ট একটি অপ্ট-ইন বিকল্প অপেক্ষার ব্যবহার করার সিদ্ধান্ত নিয়েছে। অ্যাসিঙ্ক হিসাবে চিহ্নিত না এমন কোনও ফাংশনের জন্য আপনি কোনও ইস্যু ছাড়াই অপেক্ষার নামক একটি ভেরিয়েবল নির্ধারণ করতে পারেন।

অতএব অ্যাসিঙ্ক কোনও ফাংশনের স্বাক্ষরের অংশ নয় এবং উত্পন্ন আইএল কোডটির কোনও শব্দার্থিক অর্থ নেই। কম্পাইলারটি সঠিকভাবে কীভাবে ফাংশনটি সংকলন করবেন তা জেনে রাখা এখানে কঠোরভাবে। এটি কেবল টাস্ক, টাস্ক <টি> বা শূন্যস্থান ফিরে আসছে কিনা তা নিশ্চিত করার জন্যও সংকলককে নির্দেশ দেয়।

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