🚀 جادوی async/await در #C:
برنامهنویسی غیرهمزمان به زبان ساده
تا حالا شده یه دکمه تو اپلیکیشنتون بزنید و کل برنامه برای چند ثانیه هنگ کنه و سفید بشه؟ 🥶 این اتفاق وقتی میفته که یه کار زمانبر (مثل دانلود فایل یا کوئری دیتابیس) رو به صورت همزمان (Synchronous) انجام میدید و "نخ" اصلی برنامه رو قفل میکنید.
راه حل این کابوس، برنامهنویسی غیرهمزمان (Asynchronous) با دو کلمه کلیدی جادویی async و await هست.
1️⃣ داستان سرآشپز صبور (آنالوژی) 👨🍳
برای درک این مفهوم، یه رستوران رو تصور کنید:
سرآشپز همزمان (Synchronous): 👎
شما سفارش استیک میدید. سرآشپز استیک رو روی گریل میذاره و همونجا وایمیسته و ۱۰ دقیقه بهش زل میزنه تا بپزه. تو این ۱۰ دقیقه، هیچ کار دیگهای نمیتونه بکنه و بقیه مشتریها گشنه میمونن. این یعنی قفل شدن برنامه!
سرآشپز غیرهمزمان (Asynchronous): 👍
شما سفارش استیک میدید. سرآشپز استیک رو روی گریل میذاره (await) و بلافاصله از آشپزخونه میاد بیرون و سفارش بقیه رو میگیره. اون یه "قول" (Task) داره که استیک در حال آماده شدنه. ۱۰ دقیقه بعد، وقتی استیک آماده شد، برمیگرده سراغش، کار رو تموم میکنه و به شما تحویل میده. تو این مدت، رستوران (برنامه) کاملاً فعال و پاسخگو بوده!
2️⃣ کلمات کلیدی جادویی: async, await, Task ✨
این سه تا با هم کار میکنن:
• async:
یه برچسبه که به متد میزنیم و به کامپایلر میگیم: "هی، این متد ممکنه وسط کارش منتظر یه چیزی بمونه و غیرهمزمانه". این کلمه، اجازه استفاده از await رو داخل متد میده.
• Task / Task<T>:
"قول" یا "رسیدی" هست که متد async فوراً برمیگردونه.
• Task:
یعنی "قول میدم این کار رو تموم کنم." (برای متدهایی که خروجی ندارن).
• Task<T>:
یعنی "قول میدم این کار رو تموم کنم و یه نتیجه از نوع T بهت تحویل بدم."
• await:
قلب ماجراست! این کلمه رو قبل از صدا زدن یه متد async دیگه میذاریم و به برنامه میگه:
"اجرای این کار زمانبر رو شروع کن، و تا وقتی تموم میشه، کنترل رو به کسی که منو صدا زده برگردون تا اون بتونه به کاراش برسه! وقتی کارم تموم شد، از همین خط به بعد ادامه میدم."
3️⃣ مثال عملی: دانلود کردن یک فایل
روش بد (Synchronous) که باعث هنگ کردن برنامه میشه:
// ❌ این متد نخ اصلی رو برای ۵ ثانیه قفل میکنه!
public void DownloadFile()
{
Thread.Sleep(5000); // شبیهسازی یک عملیات زمانبر و مسدودکننده
Console.WriteLine("Download complete.");
}
روش خوب (Asynchronous) با async/await:
// ✅ این متد نخ اصلی رو آزاد میکنه و برنامه پاسخگو باقی میمونه
public async Task DownloadFileAsync()
{
// await کنترل رو به بیرون برمیگردونه و منتظر میمونه
await Task.Delay(5000); // شبیهسازی یک عملیات غیرهمزمان
Console.WriteLine("Download complete.");
}
🔖 هشتگها:
#CSharp #Programming #Developer #DotNet #Async #Await #Concurrency