ঠিক আছে, এটি অদ্ভুত লাগছে, তবে কোডটি খুব সহজ এবং পরিস্থিতিটি ভালভাবে ব্যাখ্যা করেছে।
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
আরও বেশি ব্যবহার করছি । প্যাটার্নটি ইভেন্টগুলির নিম্নলিখিত চেইন নিয়ে গঠিত:
- একটি প্রাথমিক কল অপেক্ষা করুন যা আমাকে কাজ করার জন্য প্রয়োজনীয় কিছু তথ্য দেয়
- সেই তথ্যটি সমকালীনভাবে কাজ করুন
- একটি চূড়ান্ত কল অপেক্ষা করুন যা আপডেট করা কাজটি সংরক্ষণ করে
উপরের কোড ব্লকটি হ'ল সাধারণত আমি কীভাবে এই পদ্ধতিগুলি পরিচালনা করতে যাই। আমি await
প্রথম কল, যা আমাকে করতে হবে কারণ এটি অ্যাসিনক্রোনাস। এরপরে, আমার যে কাজটি করা দরকার তা আমি করি যা আইও বা সংস্থান সীমাবদ্ধ নয়, এবং তাই অ্যাসিঙ্ক নয়। অবশেষে, আমি আমার কাজটি সংরক্ষণ করি যা একটি async
কল এবং কার্গো-কাল্টের বাইরেও await
।
তবে এই প্যাটার্নটি পরিচালনা করার জন্য এটি কি সবচেয়ে দক্ষ / সঠিক উপায়? আমার কাছে মনে হচ্ছে আমি await
শেষ কলটি বন্ধ করতে পারব , তবে এটি ব্যর্থ হলে কী হবে? এবং আমি কি Task
এমন একটি পদ্ধতি ব্যবহার করব যেমন ContinueWith
মূল কলটির সাথে আমার সিঙ্ক্রোনাস কাজের চেইন করতে? আমি ঠিক এখনই এমন এক পর্যায়ে আছি যেখানে আমি এটি সঠিকভাবে পরিচালনা করছি কিনা তা সম্পর্কে নিশ্চিত নই।
উদাহরণস্বরূপ কোডটি দেওয়া , এই অ্যাসিঙ্ক / সিঙ্ক / অ্যাসিঙ্ক পদ্ধতি কল কল চেইনকে হ্যান্ডেল করার আরও ভাল কোনও উপায় আছে কি?