"

Await در سی‌شارپ,ارتباط Await و Async در سی شارپ,تفاوت Await و Thread.Sleep در سی شارپ

Await در سی‌شارپ

Await در سی‌شارپ به برنامه اجازه می‌دهد عملیات‌های زمان‌بر را به‌صورت غیرهمزمان اجرا کرده و پاسخ‌گویی برنامه را حفظ کند.

تیم تحریریه
7
0
15 خرداد 1405
لینک کوتاه

Await در سی‌شارپ

در دنیای توسعه نرم‌افزار، بسیاری از عملیات‌ها زمان‌بر هستند و ممکن است اجرای آن‌ها باعث توقف یا کند شدن برنامه شود.
عملیات‌هایی مانند خواندن و نوشتن فایل‌ها، ارسال درخواست‌های شبکه، ارتباط با پایگاه داده، دانلود اطلاعات از اینترنت و فراخوانی سرویس‌های وب معمولاً به زمان نیاز دارند.
اگر این عملیات‌ها به صورت همزمان با جریان اصلی برنامه اجرا شوند، ممکن است رابط کاربری قفل شود یا عملکرد سیستم کاهش پیدا کند.
برای حل این مشکل، زبان سی‌شارپ قابلیت برنامه‌نویسی ناهمگام (Asynchronous Programming) را ارائه می‌دهد که یکی از مهم‌ترین اجزای آن کلمه کلیدی await است.

کلمه کلیدی Await در کنار Async استفاده می‌شود و به برنامه‌نویسان اجازه می‌دهد عملیات‌های زمان‌بر را بدون مسدود کردن Thread اصلی اجرا کنند.
این ویژگی باعث می‌شود برنامه‌ها پاسخ‌گوتر، سریع‌تر و کارآمدتر باشند.



Await در سی‌شارپ



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 استفاده می‌کنیم؟



تفاوت 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;
این روش ممکن است باعث Deadlock شود.
روش توصیه‌شده:
var data =

await GetDataAsync();
  • استفاده بیش از حد از Async Void

متدهای Async معمولاً باید Task برگردانند.
مثال مناسب:
public async Task SaveData()

{

await Task.Delay(1000);

}

به جز رویدادهای رابط کاربری، استفاده از Async Void توصیه نمی‌شود.



چه زمانی از Await استفاده کنیم؟

Await برای عملیات‌های زمان‌بر مناسب است، از جمله:

  • فراخوانی API

  • دانلود فایل

  • آپلود فایل

  • ارتباط با پایگاه داده

  • خواندن فایل

  • نوشتن فایل

  • ارسال ایمیل

  • پردازش شبکه

اما برای عملیات‌های بسیار سریع و ساده معمولاً استفاده از Async و Await ضرورتی ندارد.



چه زمانی از Await استفاده کنیم؟

جمع‌بندی

Await یکی از مهم‌ترین قابلیت‌های زبان سی‌شارپ برای پیاده‌سازی برنامه‌نویسی ناهمگام است.
این کلمه کلیدی در کنار Async به برنامه‌نویسان اجازه می‌دهد عملیات‌های زمان‌بر را بدون مسدود کردن Thread اصلی اجرا کنند.
نتیجه این رویکرد، افزایش سرعت پاسخ‌گویی، بهبود تجربه کاربری و استفاده بهینه از منابع سیستم است.

امروزه در توسعه برنامه‌های دسکتاپ، وب، موبایل و سرویس‌های ابری، Async و Await نقش بسیار مهمی دارند و آشنایی کامل با آن‌ها برای هر برنامه‌نویس سی‌شارپ ضروری است.
استفاده صحیح از Await نه تنها عملکرد نرم‌افزار را بهبود می‌دهد، بلکه باعث ساده‌تر شدن کدها و افزایش قابلیت نگهداری پروژه نیز می‌شود.

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “Await در سی‌شارپ” اشتراک بزارید

برای ارسال نظر لطفا ورود یا ثبت نام کنید

منو