একক পদ্ধতির মধ্যে সিঙ্ক এবং অ্যাসিঙ্ক পদ্ধতিগুলির দক্ষ মিশ্রণ?


11

ঠিক আছে, এটি অদ্ভুত লাগছে, তবে কোডটি খুব সহজ এবং পরিস্থিতিটি ভালভাবে ব্যাখ্যা করেছে।

public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
    AssertNotDisposed();
    var roles = await GetRolesForUser(user);
    roles.Roles = RemoveRoles(roles.Roles, role);
    await Run(TableOperation.Replace(roles));
}

(আমি জানি আমি নীচের বিমূর্তে এক ধরনের কথা বলছি, তবে উপরেরটি প্রকৃত উত্পাদন কোড কী হবে তা থেকে একটি আসল পদ্ধতি যা আমি এখানে যা জিজ্ঞাসা করছি তা করছে এবং আমি আপনার প্রকৃত পর্যালোচনা করতে আগ্রহী এটি সংশোধন / অসিঙ্ক / অপেক্ষার প্যাটার্নের জন্য নির্ভুলতার জন্য))

আমি এই প্যাটার্নটির আরও অনেক বেশি মুখোমুখি হয়েছি এখন আমি async/ awaitআরও বেশি ব্যবহার করছি । প্যাটার্নটি ইভেন্টগুলির নিম্নলিখিত চেইন নিয়ে গঠিত:

  1. একটি প্রাথমিক কল অপেক্ষা করুন যা আমাকে কাজ করার জন্য প্রয়োজনীয় কিছু তথ্য দেয়
  2. সেই তথ্যটি সমকালীনভাবে কাজ করুন
  3. একটি চূড়ান্ত কল অপেক্ষা করুন যা আপডেট করা কাজটি সংরক্ষণ করে

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

তবে এই প্যাটার্নটি পরিচালনা করার জন্য এটি কি সবচেয়ে দক্ষ / সঠিক উপায়? আমার কাছে মনে হচ্ছে আমি awaitশেষ কলটি বন্ধ করতে পারব , তবে এটি ব্যর্থ হলে কী হবে? এবং আমি কি Taskএমন একটি পদ্ধতি ব্যবহার করব যেমন ContinueWithমূল কলটির সাথে আমার সিঙ্ক্রোনাস কাজের চেইন করতে? আমি ঠিক এখনই এমন এক পর্যায়ে আছি যেখানে আমি এটি সঠিকভাবে পরিচালনা করছি কিনা তা সম্পর্কে নিশ্চিত নই।

উদাহরণস্বরূপ কোডটি দেওয়া , এই অ্যাসিঙ্ক / সিঙ্ক / অ্যাসিঙ্ক পদ্ধতি কল কল চেইনকে হ্যান্ডেল করার আরও ভাল কোনও উপায় আছে কি?


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

@ ইউফোরিক: আমার শেষ কলটির জন্য অপেক্ষা করা উচিত? আমি না করলে এবং তা ছুঁড়ে মারলে কী হবে? এটি বর্তমানে যেমন আছে তেমন আলাদা হবে কি?
ছিড়ে ফেলেছে

উত্তর:


3

হ্যাঁ, আমি মনে করি এটি এটি করার সঠিক উপায়।

আপনি দ্বিতীয়টি এড়িয়ে যেতে পারবেন না await। যদি আপনি এটি করেন, পদ্ধতিটি খুব তাড়াতাড়ি সম্পন্ন হবে বলে মনে হচ্ছে (অপসারণটি বাস্তবে সম্পন্ন করার আগে) এবং অপসারণটি ব্যর্থ হয়েছে কিনা তা আপনি কখনই খুঁজে পাবেন না।

আমি দেখতে পাচ্ছি না যে কীভাবে ContinueWith()বা এর মতো কিছু এখানে সহায়তা করবে। আপনি এটি এড়ানোর জন্য এটি ব্যবহার করতে পারেন awaitতবে এটি আপনার কোডটিকে আরও জটিল এবং কম পাঠযোগ্য করে তুলবে। এবং awaitএটির পুরো বিষয়টি : ধারাবাহিকতা ব্যবহারের সাথে তুলনা করার সাথে অ্যাসিঙ্ক্রোনাস কোডটি সহজ করে লেখা।


0

এই প্যাটার্নটি হ্যান্ডেল করার উপায় হ'ল সমস্ত আই / ও-ও অ্যাসিনক্রোনাস is সিঙ্ক্রোনাস আই / ও পদ্ধতিগুলি বর্তমান থ্রেডটি ব্লক করে দেয় যখন এটি I / O গন্তব্য (নেটওয়ার্ক, ফাইল-সিস্টেম, ইত্যাদি) এর প্রতিক্রিয়ার জন্য অপেক্ষা করে।

আরেকটি বিষয় বিবেচনা করা হ'ল এটি awaitযখন আপনার কোনও রিটার্ন মান প্রয়োজন হয় বা যখন আপনি অন্য কিছু করার আগে অপেক্ষা করার কোডটির প্রয়োজন হয় তখন ব্যবহার করা উচিত। আপনার যদি এইগুলির কোনওটির প্রয়োজন না হয় তবে আপনি আপনার অ্যাসিঙ্ক পদ্ধতিটি "আগুন এবং ভুলে যেতে" পারেন Task.Run

সুতরাং, কম্পিউটিং সংস্থানগুলির সর্বাধিক দক্ষ ব্যবহারের জন্য, যদি RemoveRolesকোনও I / O হয় তবে তা হয়ে উঠতে হবে await RemoveRolesAsyncএবং যে I / O পদ্ধতিগুলি বলা হয় RemoveRolesAsyncসেগুলিও async (এবং সম্ভবত প্রতীক্ষিত) হওয়া উচিত।

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

সেরা অনুশীলনগুলির এখানে আরও গভীরভাবে নজর দেওয়া হল - https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

এএসপি.এনইটি, ওয়েবএপিআই ইত্যাদির মতো বিভিন্ন পরিবেশে কনফিগারওয়েটের আচরণ সম্পর্কে কিছু নোট এখানে দেওয়া হয়েছে - /programming/13489065/best-p ੈਕਟ- to-call-configureawait- all-server-side -code


2
আপনার কখনই টাস্ক.রুনের সাথে কোড চালানো এবং ভুলে যাওয়া উচিত নয়। সমস্ত কাজ অপেক্ষা করা উচিত। যদি আপনি এই টাস্কটির অপেক্ষায় না থাকেন এবং এই কার্যটি এমন কোনও স্থানে আবর্জনা-সংগ্রহ করা হয় যেখানে ব্যতিক্রমটি "অরক্ষিত" থাকে, এটি রান-টাইমে একটি UnobmittedTaskException উত্থাপিত করবে এবং কাঠামোর সংস্করণের উপর নির্ভর করে আপনার অ্যাপ্লিকেশনটিকে ক্র্যাশ করতে পারে।
ট্রায়ঙ্কো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.