আসলে, অ্যাসিঙ্ক / প্রতীক্ষা যে জাদুকরী নয়। পুরো বিষয়টি বেশ বিস্তৃত তবে আপনার প্রশ্নের দ্রুত এবং সম্পূর্ণ পর্যাপ্ত উত্তরের জন্য আমি মনে করি আমরা পরিচালনা করতে পারি।
উইন্ডোজ ফর্ম অ্যাপ্লিকেশনে একটি সাধারণ বোতাম ক্লিক ইভেন্টটি সামলানো যাক:
public async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("before awaiting");
await GetSomethingAsync();
Console.WriteLine("after awaiting");
}
আমি আপাতত যা ফিরিয়ে দিচ্ছে তা নিয়ে স্পষ্টভাবে কথা বলতে যাচ্ছি নাGetSomethingAsync । আসুন আমরা এটি বলি যে এটি 2 সেকেন্ড পরে সম্পূর্ণ হবে।
একটি traditionalতিহ্যবাহী, অ-আশ্রয়বিহীন, বিশ্বে আপনার বোতাম ক্লিক ইভেন্ট হ্যান্ডলারটি দেখতে এরকম কিছু দেখাবে:
public void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("before waiting");
DoSomethingThatTakes2Seconds();
Console.WriteLine("after waiting");
}
আপনি যখন ফর্মের বোতামটি ক্লিক করেন, অ্যাপ্লিকেশনটি প্রায় 2 সেকেন্ডের জন্য হিমায়িত হবে, যখন আমরা এই পদ্ধতিটি শেষ হওয়ার অপেক্ষা করব। যা হয় তা হ'ল "বার্তা পাম্প", মূলত একটি লুপ অবরুদ্ধ।
এই লুপটি ক্রমাগত উইন্ডোজকে জিজ্ঞাসা করে "" কেউ কি কিছু করেছে, যেমন মাউস সরিয়ে নিয়েছে, কোনও কিছুর উপর ক্লিক করেছে? আমার কি আবার কিছু রঙ করা দরকার? যদি তাই হয় তবে আমাকে বলুন! " এবং তারপরে সেই "কিছু" প্রক্রিয়া করে। এই লুপটি একটি বার্তা পেয়েছিল যা ব্যবহারকারী "বাটন 1" (বা উইন্ডোজ থেকে সমান ধরণের বার্তা) ক্লিক করেছেন এবং button1_Clickউপরে আমাদের পদ্ধতিটি কল করে শেষ করেছেন । এই পদ্ধতিটি ফিরে না আসা পর্যন্ত এই লুপটি এখন অপেক্ষা করে আটকে আছে। এটি 2 সেকেন্ড সময় নেয় এবং এই সময়ে কোনও বার্তা প্রক্রিয়াকরণ করা হয় না।
উইন্ডোজগুলির সাথে সম্পর্কিত বেশিরভাগ জিনিসগুলি বার্তাগুলি ব্যবহার করে করা হয়, যার অর্থ হ'ল যদি বার্তা লুপটি বার্তা পাম্প করা বন্ধ করে দেয়, এমনকি মাত্র এক সেকেন্ডের জন্যও, এটি ব্যবহারকারী দ্বারা দ্রুত লক্ষণীয় হয়। উদাহরণস্বরূপ, আপনি যদি নিজের প্রোগ্রামের শীর্ষে নোটপ্যাড বা অন্য কোনও প্রোগ্রাম সরিয়ে নিয়ে যান এবং তারপরে আবারও, আপনার প্রোগ্রামটিতে পেইন্ট বার্তাগুলির একটি ঝাঁকুনি প্রেরণ করা হয় যা উইন্ডোর কোন অঞ্চলটি হঠাৎ আবার দৃশ্যমান হয়ে উঠেছে তা নির্দেশ করে। যদি এই বার্তাগুলি প্রসেস করে এমন বার্তা লুপ যদি কোনও কিছুর জন্য অপেক্ষা করে, অবরুদ্ধ করে থাকে, তবে কোনও চিত্রকাজ করা হয়নি।
সুতরাং, যদি প্রথম উদাহরণে, async/awaitনতুন থ্রেড তৈরি না করে, এটি কীভাবে এটি করে?
ঠিক আছে, যা ঘটে তা হ'ল আপনার পদ্ধতিটি দুটি ভাগে বিভক্ত। এটি এই বিস্তৃত বিষয়গুলির মধ্যে একটি যা তাই আমি খুব বেশি বিশদে যাব না তবে এই দুটি জিনিসকে এই পদ্ধতিতে বিভক্ত করে বলাই যথেষ্ট:
awaitকল করার সময় সহ সমস্ত কোডGetSomethingAsync
- সমস্ত কোড নিম্নলিখিত
await
চিত্রণ:
code... code... code... await X(); ... code... code... code...
পুনর্বিন্যাস:
code... code... code... var x = X(); await X; code... code... code...
^ ^ ^ ^
+---- portion 1 -------------------+ +---- portion 2 ------+
মূলত পদ্ধতিটি এভাবে চালায়:
- এটি সবকিছু সম্পাদন করে
await
এটি সেই GetSomethingAsyncপদ্ধতিটিকে কল করে , যা এটি করে এবং এটি এমন কিছু দেয় যা ভবিষ্যতে 2 সেকেন্ড পূর্ণ হবে
এখনও অবধি আমরা মেসেজ লুপ থেকে কল করা মূল থ্রেডে বাটন 1_ ক্লিক করে মূল কলটির ভিতরে রয়েছি। যদি শীর্ষস্থানীয় কোডটি awaitঅনেক সময় নেয় তবে ইউআই এখনও স্থির হবে। আমাদের উদাহরণে, এত কিছু না
কী- awaitওয়ার্ডটি কিছু চতুর সংকলক যাদুর সাথে একসাথে করে তা হ'ল এটি মূলত "ঠিক আছে, আপনি কি জানেন, আমি এখানে কেবল বোতাম ক্লিক ইভেন্ট হ্যান্ডলারটি থেকে ফিরে আসছি When আপনি যখন (যেমন হিসাবে থাকবেন, তবে আমরা জিনিসটি) পুনরায় অপেক্ষা করছেন) সমাপ্তির কাছাকাছি আসুন, আমাকে জানান কারণ আমার এখনও কার্যকর করতে কিছু কোড বাকী আছে "left
আসলে এটি সিঙ্ক্রোনাইজেশন কনটেক্সট ক্লাসকে জানতে দেয় যে এটি সম্পন্ন হয়েছে, যা এই মুহূর্তে প্লেতে আসার আসল সিনক্রোনাইজেশন প্রসঙ্গে নির্ভর করে মৃত্যুদন্ড কার্যকর করার জন্য সারিবদ্ধ হবে। উইন্ডোজ ফর্ম প্রোগ্রামে ব্যবহৃত প্রসঙ্গ শ্রেণিটি ম্যাসেজের লুপটি পাম্প করছে এমন সারিটি ব্যবহার করে এটি সারি করবে।
সুতরাং এটি বার্তা লুপটিতে ফিরে আসে, যা এখন উইন্ডোটি সরিয়ে নেওয়া, পুনরায় আকার দেওয়ার বা অন্য বোতামে ক্লিক করার মতো বার্তা পাম্প চালিয়ে যেতে বিনামূল্যে।
ব্যবহারকারীর জন্য, ইউআই এখন আবার প্রতিক্রিয়াশীল, অন্যান্য বোতামের ক্লিকগুলিকে পুনরায় আকার দিচ্ছে এবং সবচেয়ে গুরুত্বপূর্ণভাবে, পুনরায় আঁকছে , যাতে এটি হিমায়িত হয় না।
- 2 সেকেন্ড পরে, আমরা যে বিষয়টিটির জন্য অপেক্ষা করছি এটি এখন সম্পূর্ণ হয় এবং এখন যা ঘটে তা হ'ল এটি (ভাল, সিঙ্ক্রোনাইজেশন প্রসঙ্গে) একটি বার্তাটিকে কাতারে রাখে যা বার্তা লুপটি দেখছে, "আরে, এর জন্য আমি আরও কিছু কোড পেয়েছি আপনি কার্যকর করতে ", এবং এই কোডটি অপেক্ষার পরে সমস্ত কোড ।
- বার্তাটির লুপটি সেই বার্তায় পৌঁছে গেলে, এটি মূলত সেই পদ্ধতিটি "পুনরায় প্রবেশ" করবে যেখানে এটি ছেড়ে গেছে, ঠিক এর পরে
awaitএবং বাকি পদ্ধতিটি কার্যকর করে চালিয়ে যাওয়া। নোট করুন যে এই কোডটি আবার বার্তা লুপ থেকে কল করা হয়েছে তাই যদি এই কোডটি async/awaitসঠিকভাবে ব্যবহার না করে দীর্ঘায়িত কিছু করা হয়ে থাকে তবে এটি আবার বার্তা লুপটিকে অবরুদ্ধ করবে
হুডের নীচে অনেকগুলি চলমান অংশ রয়েছে তাই এখানে আরও তথ্যের কয়েকটি লিঙ্ক রয়েছে, আমি বলতে চাইছিলাম "আপনার এটির দরকার হওয়া উচিত", তবে এই বিষয়টি বেশ বিস্তৃত এবং চলমান অংশগুলির কয়েকটি জানা মোটামুটি গুরুত্বপূর্ণ । অবিচ্ছিন্নভাবে আপনি বুঝতে যাচ্ছেন যে async / প্রতীক্ষা এখনও একটি ফাঁস ধারণা। অন্তর্নিহিত কিছু সীমাবদ্ধতা এবং সমস্যাগুলি এখনও আশেপাশের কোডটিতে ফাঁস হয়ে যায় এবং যদি তা না করে তবে আপনি সাধারণত কোনও অ্যাপ্লিকেশনটি ডিবাগ করে ফেলেন যা আপাতদৃষ্টিতে কোনও ভাল কারণ নয় বলে এলোমেলোভাবে ভেঙে যায়।
ঠিক আছে, সুতরাং GetSomethingAsync2 সেকেন্ডের মধ্যে সম্পূর্ণ হবে যে থ্রেড স্পিন যদি ? হ্যাঁ, তাহলে অবশ্যই খেলতে একটি নতুন থ্রেড রয়েছে। এই থ্রেডটি যদিও এই পদ্ধতির async-ness এর কারণে নয়, কারণ এই পদ্ধতির প্রোগ্রামার অ্যাসিঙ্ক্রোনাস কোড প্রয়োগের জন্য একটি থ্রেড বেছে নিয়েছিল। প্রায় সমস্ত অ্যাসিক্রোনাস আই / ও কোনও থ্রেড ব্যবহার করে না , তারা বিভিন্ন জিনিস ব্যবহার করে। async/await নিজেরাই নতুন থ্রেড স্পিন করবেন না তবে স্পষ্টতই থ্রেড ব্যবহার করে "আমরা অপেক্ষা করি" জিনিসগুলি প্রয়োগ করা যেতে পারে।
.NET- এ এমন অনেকগুলি বিষয় রয়েছে যা অগত্যা তাদের নিজের উপর কোনও থ্রেড স্পিন করে না তবে তারা এখনও অ্যাসিনক্রোনাস হয়:
- ওয়েব অনুরোধগুলি (এবং আরও অনেকগুলি নেটওয়ার্ক সম্পর্কিত জিনিস যা সময় নেয়)
- অ্যাসিঙ্ক্রোনাস ফাইল পড়া এবং লেখা
- এবং আরো অনেক, একটি ভাল লক্ষণ যদি প্রশ্নে বর্গ / ইন্টারফেস সংঙ্ক্রান্ত নাম দিয়েছে পদ্ধতি
SomethingSomethingAsyncবা BeginSomethingএবং EndSomethingসেখানে একটি ব্যাপার IAsyncResultজড়িত।
সাধারণত এই জিনিসগুলি হুডের নিচে থ্রেড ব্যবহার করে না।
ঠিক আছে, তাই আপনি কিছু "ব্রড টপিক স্টাফ" চান?
আচ্ছা, আমাদের বোতাম ক্লিক সম্পর্কে রজলিনকে জিজ্ঞাসা করুন :
রোজলিন চেষ্টা করুন
আমি এখানে পূর্ণ উত্পন্ন শ্রেণিতে লিঙ্ক করতে যাচ্ছি না তবে এটি বেশ সুন্দর বিষয়।