সি # 's async
/ ব্যবহার করে অ্যাসিক্রোনাস প্রোগ্রামিংয়ের জন্য আমি কয়েকটি সেরা অনুশীলন পেয়েছিawait
কীওয়ার্ডগুলি (আমি সি # 5.0 এ নতুন) আমি পেয়েছি।
প্রদত্ত পরামর্শগুলির মধ্যে একটি ছিল:
স্থায়িত্ব: আপনার সিঙ্ক্রোনাইজেশন প্রসঙ্গে জানুন
... কিছু সিঙ্ক্রোনাইজেশন প্রসঙ্গটি পুনঃপ্রেরণকারী এবং একক থ্রেডযুক্ত। এর অর্থ একটি নির্দিষ্ট সময়ে নির্দিষ্ট সময়ে শুধুমাত্র একটি ইউনিট কাজ প্রসঙ্গে কার্যকর করা যেতে পারে। এর উদাহরণ উইন্ডোজ ইউআই থ্রেড বা এএসপি.নেট অনুরোধের প্রসঙ্গ। এই একক থ্রেডযুক্ত সিঙ্ক্রোনাইজেশন প্রসঙ্গে, নিজেকে ডিডলক করা সহজ। যদি আপনি কোনও একক থ্রেড প্রসঙ্গ থেকে কোনও কাজ বন্ধ করে দেন, তবে সেই প্রসঙ্গে প্রাসঙ্গিকভাবে সেই কাজটির জন্য অপেক্ষা করুন, আপনার ওয়েটিং কোডটি ব্যাকগ্রাউন্ড টাস্কটি ব্লক করছে।
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
যদি আমি নিজে এটি ছড়িয়ে দেওয়ার চেষ্টা করি, মূল থ্রেডটি একটি নতুনকে প্রসারিত করে MyWebService.GetDataAsync();
, তবে যেহেতু মূল থ্রেডটি সেখানে অপেক্ষা করছে, এটি ফলাফলটির জন্য অপেক্ষা করে GetDataAsync().Result
। এদিকে, ডেটা প্রস্তুত আছে বলে। মূল থ্রেড কেন চালিয়ে যায় না এটির ধারাবাহিকতা যুক্তিযুক্ত এবং এর থেকে স্ট্রিং ফলাফল প্রদান করেGetDataAsync()
?
কেউ দয়া করে আমাকে ব্যাখ্যা করতে পারেন কেন উপরের উদাহরণটিতে অচলাবস্থা রয়েছে? সমস্যাটি কী তা সম্পর্কে আমি সম্পূর্ণ নির্বোধ ...