সি # 5.0 এ অ্যাসিঙ্ক এবং নিয়মিত ফাংশনগুলির মধ্যে লাইনগুলি ঝাপসা করে


10

ইদানীং আমি সি # 5.0 এর আশ্চর্যজনক অ্যাসিঙ্ক-অপেক্ষার প্যাটার্নটি যথেষ্ট পরিমাণে পেয়েছি বলে মনে হচ্ছে না । আপনি আমার সারা জীবন কোথায় ছিল?

আমি সাধারণ বাক্য গঠনটি নিয়ে একেবারে শিহরিত, তবে আমার একটি ছোট সমস্যা হচ্ছে। আমার সমস্যা হ'ল নিয়মিত ফাংশন থেকে অ্যাসিঙ্ক ফাংশনগুলির সম্পূর্ণ ভিন্ন ঘোষণা রয়েছে। যেহেতু কেবলমাত্র অ্যাসিঙ্ক ফাংশনগুলি অন্যান্য অ্যাসিঙ্ক ফাংশনগুলির জন্য অপেক্ষা করতে পারে, যখন আমি কিছু পুরানো ব্লকিং কোডটি অ্যাসিঙ্কে পোর্ট করার চেষ্টা করি, তখন আমার রূপান্তর করতে হবে এমন ক্রিয়াকলাপগুলির ডমিনো প্রভাব আমার রয়েছে having

লোকজন এটিকে জম্বি পীড়ন হিসাবে উল্লেখ করছে । যখন আপনার কোডটিতে অ্যাসিঙ্কটি একটি কামড় পেয়েছে, এটি আরও বড় হতে থাকবে। পোর্টিং প্রক্রিয়াটি কঠিন নয়, এটি কেবল asyncঘোষণার মধ্যে ছোঁড়াচ্ছে এবং সাথে ফেরতের মানটি মোড়ানো Task<>। কিন্তু পুরানো সিঙ্ক্রোনাস কোডটি পোর্ট করার সময় বারবার এটি করা বিরক্তিকর।

আমার কাছে মনে হয় এটি উভয় ফাংশনের ধরণের (অ্যাসিঙ্ক এবং প্লেইন পুরাতন সিঙ্ক) হুবহু সিনট্যাক্স থাকলে এটি অনেক বেশি প্রাকৃতিক হবে। যদি এটি হয় তবে পোর্টিংয়ে শূন্য প্রচেষ্টা লাগবে এবং আমি দুটি ফর্মের মধ্যে ব্যাথা ছাড়াই পরিবর্তন করতে পারি।

আমি মনে করি আমরা যদি এই নিয়মগুলি অনুসরণ করি তবে এটি কাজ করতে পারে:

  1. অ্যাসিঙ্ক ফাংশনগুলির asyncআর ঘোষণার প্রয়োজন হবে না । তাদের রিটার্নের ধরণগুলি মোড়ানো হবে না Task<>। সংকলক নিজেই সংকলনের সময় একটি অ্যাসিঙ্ক ফাংশন সনাক্ত করবে এবং প্রয়োজন অনুসারে স্বয়ংক্রিয়ভাবে মোড়ক টাস্কটি করবে।

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

  3. আপনি যদি সত্যিই অগ্নি-বিস্মৃত না হয়ে বাঁচতে না পারেন তবে এর জন্য বিশেষ সিনট্যাক্স থাকবে। যাই হোক না কেন, এটি যে সহজ ইউনিফাইড সিনট্যাক্সের কথা বলছি তার অংশ হবে না।

  4. অ্যাসিঙ্ক্রোনাস কল বোঝাতে আপনার কেবলমাত্র কীওয়ার্ডটি হ'ল await। যদি আপনি অপেক্ষা করেন, কলটি অ্যাসিক্রোনাস। যদি আপনি এটি না করেন, কলটি পুরানো সমকালীন (মনে রাখবেন, আমাদের আর ফায়ার-অ্যান্ড-ভুলে যাওয়া নেই)।

  5. সংকলক স্বয়ংক্রিয়ভাবে async ফাংশন সনাক্ত করবে (যেহেতু তাদের আর কোনও বিশেষ ঘোষণা নেই)। বিধি 4 এটি করা খুব সহজ করে তোলে - যদি কোনও ফাংশনটির awaitভিতরে কল থাকে তবে এটি অ্যাসিঙ্ক।

এই কাজ করতে পারে? নাকি আমি কিছু মিস করছি? এই একীভূত বাক্য গঠনটি আরও অনেক তরল এবং এটি জম্বিদের আক্রমণ পুরোপুরি সমাধান করতে পারে।

কিছু উদাহরণ:

// assume this is an async function (has await calls inside)
int CalcRemoteBalanceAsync() { ... }

// assume this is a regular sync function (has no await calls inside)
int CalcRemoteBalance() { ... }

// now let's try all combinations and see what they do:

// this is the common synchronous case - it will block
int b1 = CalcRemoteBalance();

// this is the common asynchronous case - it will not block
int b2 = await CalcRemoteBalanceAsync();

// choosing to call an asynchronous function in a synchronous manner - it will block
// this syntax was used previously for async fire-and-forget, but now it's just synchronous
int b3 = CalcRemoteBalanceAsync();

// strange combination - it will block since it's calling a synchronous function
// it should probably show a compilation warning though
int b4 = await CalcRemoteBalance();

দ্রষ্টব্য: এটি এসও-তে একটি আকর্ষণীয় সম্পর্কিত আলোচনার ধারাবাহিকতা


3
আপনি কি সবসময় আপনার অ্যাসিনক্রোনাস অপারেশনের জন্য অপেক্ষা করছেন? দয়া করে আমাকে বলুন যে আপনি তাদের গুলি চালানোর পরে অবিলম্বে এটি করবেন না ...
জিমি হোফা

1
এছাড়াও, অ্যাসিঙ্ক সম্পর্কে দুর্দান্ত জিনিসগুলির একটি হ'ল আপনাকে awaitঅবিলম্বে আর করতে হবে না । আপনি যেমন কিছু করতে পারেন var task = FooAsync(); Bar(); await task;। আপনার প্রস্তাবটিতে আমি এটি কীভাবে করব?
সোভিক

3
তাহলে কি আলোচনা হচ্ছে ? আমার বিএফজি -3000 কোথায় ...
রবার্ট হার্ভে

2
@ টালকোল আপনি কি মনে করেন যে সমান্তরাল প্রোগ্রামিংটি অশ্লীল? আপনি যখন কথা বলছেন, কমপক্ষে বলতে গেলে এটি একটি আকর্ষণীয় দৃষ্টিভঙ্গি async। আমি মনে করি এটি এর অন্যতম বৃহত সুবিধা async- await: এটি আপনাকে সহজেই অ্যাসিনক্রোনাস অপারেশনগুলি রচনা করতে দেয় (এবং কেবল সহজ "স্টার্ট এ" তে নয়, এ এর ​​জন্য অপেক্ষা করুন, বি শুরু করুন, বি এর জন্য অপেক্ষা করুন)। এবং ইতিমধ্যে ঠিক এই উদ্দেশ্যে বিশেষ সিনট্যাক্স রয়েছে: একে বলা হয় await
সোভিক

1
@ এসভিক হাহা, এখন আমরা সেখানে চলে গেছি :) আমি মনে করি না যে সমান্তরাল অগ্রগতি অশ্লীল, তবে আমি মনে করি এটি অসম্পূর্ণ-প্রতীক্ষার সাথে করা হয় doing অ্যাসিঙ্ক-অপেক্ষার অবরুদ্ধকরণের মূল্য প্রদান না করে আপনার সিঙ্ক্রোনাস স্ট্যাটাস রাখার জন্য সিনট্যাকটিক চিনি। আপনি যদি ইতিমধ্যে সমান্তরালভাবে চিন্তা করে থাকেন, তবে আমি আপনাকে আলাদা প্যাটার্ন ব্যবহার করার জন্য অনুরোধ করব
টকল

উত্তর:


9

আপনার প্রশ্নের উত্তর ইতিমধ্যে আপনার লিঙ্কিত এসও প্রশ্নের জবাব দেওয়া হয়েছে।

অ্যাসিঙ্ক / অপেক্ষার উদ্দেশ্য হ'ল অনেক উচ্চতর বিলম্বিত ক্রিয়াকলাপ সহ কোনও পৃথিবীতে কোড লেখা সহজ করা। আপনার অপারেশন বেশীরভাগ হয় না উচ্চ অদৃশ্যতা।

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

সেগুলিকে অবিচ্ছিন্ন করতে কয়টি পদ্ধতির পুনর্লিখন করতে হয়েছিল? এর মধ্যে প্রায় 10 শতাংশ। অন্যান্য 90% মোটেই প্রভাবিত হয়নি।

এরিক লিপার্ট মোটামুটি যথেষ্ট প্রযুক্তিগত বিশদে বিশদ ব্যাখ্যা করতে গিয়েছিল যে তারা কেন এক-আকারের ফিটনেস-সমস্ত পদ্ধতির না নেয়। তিনি মূলত বলেছেন যে asyncএবং awaitএটি ধারাবাহিকতা-পাসিং শৈলীর একটি আংশিক বাস্তবায়ন এবং সমস্ত ক্ষেত্রে ফিট করার জন্য এই জাতীয় শৈলীর অনুকূলকরণ করা একটি কঠিন সমস্যা।


দয়া করে এসও প্রশ্ন এবং এটির মধ্যে উল্লেখযোগ্য পার্থক্য নোট করুন। এসও জিজ্ঞাসা করে কেন সমস্ত কিছুকে অ্যাসিঙ্ক করা হয় না। এখানে আমরা এটি প্রস্তাব দিই না, আমরা 10% অ্যাসিঙ্ক তৈরি করার পরামর্শ দিই, কেবল এটির জন্য একই সিনট্যাক্স ব্যবহার করে। কাছাকাছি বাক্য গঠন ব্যবহার করার সুবিধা রয়েছে যে আপনি এই পরিবর্তনগুলি থেকে ডোমিনো প্রভাব ভোগ না করে কোন 10%
অ্যাসিঙ্ক

asyncজম্বি পোকামাকড় কেন হবে তা নিয়ে আমি কিছুটা অস্পষ্ট । এমনকি যদি কোনও পদ্ধতি 10 টি অন্যান্য পদ্ধতি কল করে তবে আপনার কি কেবল asyncশীর্ষ স্তরের কোনওটি নেই?
রবার্ট হার্ভে

6
ধরা যাক আমার বর্তমান কোডের 100% সিঙ্ক হয়। এখন আমার কাছে একটি একক অভ্যন্তরীণ পাত-স্তরের ফাংশন রয়েছে যা ডিবি-কে জিজ্ঞাসা করে যেটি আমি async এ পরিবর্তন করতে চাই। এখন এটি অ্যাসিঙ্ক করার জন্য আমার এর কলারটি এসিঙ্ক হওয়া দরকার, এবং তার কলারকে অ্যাসিঙ্ক করা প্রয়োজন, এবং শীর্ষ স্তরের আগ পর্যন্ত। অবশ্যই আমি সেই মামলার কথা বলছি যেখানে পুরো শৃঙ্খলা অপেক্ষা করা হচ্ছে (কোডের সিঙ্ক্রোনাস ডিজাইন রাখতে বা রিটার্ন
ভেলগুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.