Await در سیشارپ
Await در سیشارپ به برنامه اجازه میدهد عملیاتهای زمانبر را بهصورت غیرهمزمان اجرا کرده و پاسخگویی برنامه را حفظ کند.
Await در سیشارپ
در دنیای توسعه نرمافزار، بسیاری از عملیاتها زمانبر هستند و ممکن است اجرای آنها باعث توقف یا کند شدن برنامه شود.
عملیاتهایی مانند خواندن و نوشتن فایلها، ارسال درخواستهای شبکه، ارتباط با پایگاه داده، دانلود اطلاعات از اینترنت و فراخوانی سرویسهای وب معمولاً به زمان نیاز دارند.
اگر این عملیاتها به صورت همزمان با جریان اصلی برنامه اجرا شوند، ممکن است رابط کاربری قفل شود یا عملکرد سیستم کاهش پیدا کند.
برای حل این مشکل، زبان سیشارپ قابلیت برنامهنویسی ناهمگام (Asynchronous Programming) را ارائه میدهد که یکی از مهمترین اجزای آن کلمه کلیدی await است.
کلمه کلیدی Await در کنار Async استفاده میشود و به برنامهنویسان اجازه میدهد عملیاتهای زمانبر را بدون مسدود کردن Thread اصلی اجرا کنند.
این ویژگی باعث میشود برنامهها پاسخگوتر، سریعتر و کارآمدتر باشند.
Await چیست؟
Await یک کلمه کلیدی در زبان #C است که برای انتظار غیرهمزمان (Asynchronous Waiting) استفاده میشود.
هنگامی که برنامه به یک عبارت Await میرسد، اجرای متد تا زمان تکمیل عملیات موردنظر متوقف میشود؛ اما Thread جاری آزاد میشود تا بتواند کارهای دیگری انجام دهد.
به بیان ساده، Await به برنامه میگوید:
«تا پایان این عملیات منتظر بمان، اما Thread را قفل نکن.»
این موضوع تفاوت اصلی Await با روشهای سنتی انتظار مانند Sleep یا Wait است.
ساختار کلی استفاده از Await به صورت زیر است:
await SomeAsyncMethod();
متدی که با Await فراخوانی میشود معمولاً یک شیء از نوع Task یا Task<T> را برمیگرداند.
ارتباط Await و Async در سی شارپ
Await به تنهایی قابل استفاده نیست و باید در متدی قرار گیرد که با کلمه کلیدی Async تعریف شده باشد.
مثال:
public async Task LoadData()
{
await GetDataAsync();
}
در این مثال:
- Async مشخص میکند که متد از عملیات ناهمگام پشتیبانی میکند.
- Await باعث میشود برنامه تا پایان عملیات GetDataAsync منتظر بماند.
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
چرا از Await استفاده میکنیم؟
قبل از معرفی Async و Await، برنامهنویسان برای اجرای عملیات ناهمگام از Threadها، Callbackها یا Eventها استفاده میکردند.
این روشها پیچیدگی زیادی داشتند و نگهداری کد را دشوار میکردند.
Await مزایای زیر را فراهم میکند:
-
سادهتر شدن کدنویسی
-
افزایش خوانایی کد
-
جلوگیری از قفل شدن رابط کاربری
-
استفاده بهتر از منابع سیستم
-
کاهش پیچیدگی مدیریت Threadها
به همین دلیل Async و Await به یکی از مهمترین قابلیتهای مدرن سیشارپ تبدیل شدهاند.
مثال ساده Await
فرض کنید متدی داریم که سه ثانیه زمان نیاز دارد:
public async Task DelayExample()
{
await Task.Delay(3000);
Console.WriteLine("عملیات پایان یافت");
}
در این مثال:
Task.Delay(3000)
سه ثانیه صبر میکند.
- اما برخلاف Thread.Sleep، Thread را مسدود نمیکند.
- پس از پایان سه ثانیه، اجرای برنامه ادامه پیدا میکند.
تفاوت Await و Thread.Sleep در سی شارپ
بسیاری از برنامهنویسان تازهکار این دو را مشابه تصور میکنند.
-
Thread.Sleep
Thread.Sleep(3000);
-
- Thread را کاملاً متوقف میکند.
- در این مدت هیچ کاری انجام نمیشود.
- ممکن است رابط کاربری قفل شود.
-
Await
await Task.Delay(3000);
ویژگیها:
-
-
Thread را آزاد میکند.
-
سیستم میتواند کارهای دیگر را انجام دهد.
-
عملکرد بهتری دارد.
-
به همین دلیل در برنامههای مدرن استفاده از Await ترجیح داده میشود.
Await در درخواستهای وب
یکی از رایجترین کاربردهای Await ارسال درخواست به سرویسهای اینترنتی است.
مثال:
using System.Net.Http;
public async Task<string> GetData()
{
HttpClient client = new HttpClient();
string result =
await client.GetStringAsync(
"https://example.com");
return result;
}
در این مثال:
- درخواست به سرور ارسال میشود.
- برنامه منتظر پاسخ میماند.
- در این مدت Thread اصلی آزاد است.
این موضوع به ویژه در برنامههای تحت وب و دسکتاپ اهمیت زیادی دارد.
Await در کار با پایگاه داده
یکی دیگر از کاربردهای مهم Await، اجرای Queryهای پایگاه داده است.
مثال:
var customers =
await context.Customers
.ToListAsync();
در این حالت:
- دادهها از پایگاه داده خوانده میشوند.
- Thread اصلی بلاک نمیشود.
- برنامه پاسخگویی خود را حفظ میکند.
در پروژههای بزرگ این موضوع تأثیر قابلتوجهی بر عملکرد سیستم دارد.
مقدار بازگشتی در Await
Await میتواند مقدار بازگشتی متدهای Async را دریافت کند.
مثال:
public async Task<int> GetNumber()
{
await Task.Delay(1000);
return 100;
}
استفاده:
int number = await GetNumber();
Console.WriteLine(number);
خروجی:
100
در این مثال مقدار بازگشتی پس از پایان عملیات دریافت میشود.
اجرای چند عملیات همزمان
گاهی لازم است چند عملیات Async به صورت همزمان اجرا شوند.
مثال:
Task task1 = DownloadFile1();
Task task2 = DownloadFile2();
await Task.WhenAll(task1, task2);
مزایا:
- هر دو عملیات همزمان اجرا میشوند.
- زمان کلی کاهش مییابد.
- بهرهوری سیستم افزایش پیدا میکند.
- این روش در برنامههای حرفهای بسیار رایج است.
Await در برنامههای Windows Forms و WPF
در برنامههای دارای رابط کاربری، اجرای عملیات سنگین روی Thread اصلی باعث فریز شدن برنامه میشود.
مثال:
private async void btnLoad_Click(
object sender,
EventArgs e)
{
await LoadDataAsync();
MessageBox.Show("پایان عملیات");
}
در این مثال:
- کاربر همچنان میتواند با برنامه کار کند.
- رابط کاربری قفل نمیشود.
- تجربه کاربری بهبود پیدا میکند.
Await در ASP.NET
در برنامههای وب نیز استفاده از Await اهمیت زیادی دارد.
مثال:
public async Task<IActionResult> Index()
{
var products =
await _context.Products
.ToListAsync();
return View(products);
}
مزایا:
- مصرف کمتر Threadها
- پاسخگویی بهتر سرور
- توانایی سرویسدهی به کاربران بیشتر
به همین دلیل تقریباً تمام پروژههای مدرن ASP.NET از Async و Await استفاده میکنند.
مدیریت خطا در Await
- عملیات Async نیز ممکن است با خطا مواجه شوند.
- برای مدیریت خطا میتوان از Try-Catch استفاده کرد.
مثال:
try
{
await DownloadFileAsync();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
در این حالت اگر عملیات با خطا مواجه شود، Exception مدیریت خواهد شد.
اشتباهات رایج در استفاده از Await
-
فراموش کردن Await
مثال اشتباه:
GetDataAsync();
در این حالت برنامه منتظر تکمیل عملیات نمیماند.
روش صحیح:
await GetDataAsync();
-
استفاده از Result
مثال:
var data =
GetDataAsync().Result;
var data =
await GetDataAsync();
-
استفاده بیش از حد از Async Void
public async Task SaveData()
{
await Task.Delay(1000);
}
به جز رویدادهای رابط کاربری، استفاده از Async Void توصیه نمیشود.
چه زمانی از Await استفاده کنیم؟
Await برای عملیاتهای زمانبر مناسب است، از جمله:
-
فراخوانی API
-
دانلود فایل
-
آپلود فایل
-
ارتباط با پایگاه داده
-
خواندن فایل
-
نوشتن فایل
-
ارسال ایمیل
-
پردازش شبکه
اما برای عملیاتهای بسیار سریع و ساده معمولاً استفاده از Async و Await ضرورتی ندارد.
جمعبندی
Await یکی از مهمترین قابلیتهای زبان سیشارپ برای پیادهسازی برنامهنویسی ناهمگام است.
این کلمه کلیدی در کنار Async به برنامهنویسان اجازه میدهد عملیاتهای زمانبر را بدون مسدود کردن Thread اصلی اجرا کنند.
نتیجه این رویکرد، افزایش سرعت پاسخگویی، بهبود تجربه کاربری و استفاده بهینه از منابع سیستم است.
امروزه در توسعه برنامههای دسکتاپ، وب، موبایل و سرویسهای ابری، Async و Await نقش بسیار مهمی دارند و آشنایی کامل با آنها برای هر برنامهنویس سیشارپ ضروری است.
استفاده صحیح از Await نه تنها عملکرد نرمافزار را بهبود میدهد، بلکه باعث سادهتر شدن کدها و افزایش قابلیت نگهداری پروژه نیز میشود.



کاربران ما
شما هم نظرتون با ما دریاره “Await در سیشارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید