آموزش Async Await در asp.net core
در این آموزش ابتدا برسی میکنیم که Async Await چیست؟ و سپس به آموزش Async Await در asp.net core میپردازیم. عبارات کلیدی async و await در نسخه ۵٫۰ زبان C# معرفی شدند تا برنامهنویسی ناهمگام را سادهتر کنند. عبارت کلیدی async برای اعلام یک متد به عنوان متد ناهمگام استفاده میشود. وقتی یک متد با async مشخص میشود، در هنگام انتظار برای جواب این متد، سایر وظایف قابل اجرا هستند.
برنامه نویسی همزمان و ناهمزمان
برای استفاده از async و await در ASP.NET Core، ابتدا باید مفهوم برنامهنویسی ناهمزمان – asynchronous را درک کنیم. در برنامههای همزمان – synchronous، عملیاتها به ترتیب انجام میشوند و اجرای یک عملیات متوقف میشود تا عملیات قبلی به پایان برسد. در مقابل، در برنامهنویسی ناهمگام، عملیاتها میتوانند بهطور مستقل از یکدیگر و بدون توقف اجرا شوند، به خصوص زمانی که نیاز به عملیاتهای زمانبر مانند درخواست به پایگاه داده یا شبکه داریم.
Async Await چیست؟
- مفهوم async: وقتی متدی را به عنوان async تعریف میکنید، به این معناست که این متد عملیات ناهمزمان انجام میدهد. متدی که async است باید از نوع Task باشد.
- مفهوم await: با استفاده از await، میتوانیم صبر کنیم تا یک عملیات ناهمگام به پایان برسد. اجرای کد پس از await زمانی ادامه مییابد که عملیات قبلی تمام شده باشد، بدون اینکه کل برنامه مسدود شود.
چه زمانی از Async Await استفاده کنیم؟
- دسترسی به دیتابیس: زمانی که از ORMهایی مثل Entity Framework Core استفاده میکنیم، متدهای غیرهمزمان مثل ToListAsync یا SaveChangesAsync به ما کمک میکنند تا از مسدود شدن thread جلوگیری کنیم. به این ترتیب، برنامه به جای منتظر ماندن برای دریافت نتیجه از دیتابیس، میتواند به اجرای سایر درخواستها ادامه دهد.
- فراخوانی APIهای خارجی: زمانی که باید درخواستهایی به سرویسهای خارجی ارسال کنیم، استفاده از async و await این امکان را فراهم میکند که درخواستهای دیگر تحت تأثیر این انتظار قرار نگیرند.
- ورودی/خروجی فایلها: اگر نیاز به خواندن یا نوشتن فایلها داشته باشیم. استفاده از متدهای غیرهمزمانی مانند ReadAsync و WriteAsync اجازه میدهد برنامه به عملیاتهای دیگر ادامه دهد.
چه زمانی نباید از async و await استفاده کنیم؟
- اگر عملیات شما محاسباتی است و در حافظه اجرا میشود (مثل عملیات ریاضی سنگین)، استفاده از async کمک زیادی نخواهد کرد.
- برای عملیاتهایی که به شکل طبیعی سریع و کوتاه هستند، استفاده از async ممکن است تأثیر چندانی نداشته باشد و حتی باعث پیچیدگی شود.
نکات مهم در استفاده از async و await
- بهبود عملکرد: در برنامههای وبی که درخواستهای زیادی دریافت میکنند، استفاده از برنامهنویسی ناهمگام به سرور اجازه میدهد که به جای مسدود کردن منابع برای درخواستهای زمانبر، به درخواستهای دیگر نیز پاسخ دهد.
- عدم مسدود شدن UI .
- هر متدی که await در آن استفاده شود باید async باشد.
- از async و await برای عملیاتهایی که زمانبر هستند، مانند خواندن یا نوشتن در پایگاه داده یا فایل، یا ارسال درخواستهای HTTP استفاده میشود.
- استفاده از برنامهنویسی ناهمگام باعث میشود که منابع سرور بهینهتر استفاده شوند، به خصوص در مواقعی که بار کاری بالا است.
نحوه پیاده سازی async و await
- خروجی توابع، متد، اکشن و … Async از نوع Task میباشد. ولی خود Task میتواند از هر نوعی باشد مثلا Int یا Action و … اگر توابع، متد، اکشن و … Async ما Void بود نیازی به اضافه کردن مقدار خروجی به Task نمیباشد.
public async Task<IActionResult> test(){}
- زمانی که از Async استفاده میکنیم. بهتر است به نام توابع خود مقدار Async را اضافه کنیم. اگر به نام یک اکشن مقدار Async را اضافه کنید. باید نام ویو آن را در قسمت return مشخص کنید.
public async Task<IActionResult> testAsync()
{
return View("testAsync");
}
- وقتی از Async استفاده میکنید. حتما باید از Await استفاده کنید. Await را جایی اضافه میکنیم که برنامه باید صبر کند تانتیجه – Result برای آن برگردد.
- وقتی از Async استفاده میکنید. برای ایجاد وقفه نباید دیگر از دستور Thread.Sleep استفاده کنید. بلکه باید از دستور await Task.Delay استفاده کنید.
await Task.Delay(1000);
- زمانی که مثلا یک حلقه For و یا هر چیز دیگری داریم و نیاز به Await دارد. ولی نمیتوان Await را به آن اضافه کرد. میتوانید مثل زیر اقدام کنید.
private async Task<int> Sum(int num)
{
int sum = 0;
await Task.Run(() =>
{
for (int i = 0; i < num; i++)
{
sum += i;
}
});
return sum;
}
- حال فرض کنید تابع بالا را برای یک اکشن غیر Async میخواهید فراخوانی کنید. و مقدار آن را داخل متغیری بریزید برای اینکه به شما ارور ندهد باید مانند زیر از Resualt استفاده کنید.
public IActionResult Index()
{
int sum = Sum(5).Result;
return View();
}
- منابع در برنامه های تحت وب خیلی محدود است.پس باید آن را مدیریت کنیم. فرض کنید کاربر یک درخواست سنگین برای دریافت تعداد زیادی کاربر به سرور ارسال کرده. ولی قبل از این که خروجی برای آن آماده شود صفحه مرورگر را میبندد. در این مواقع ما باید منابع سرور را آزاد کنیم چون کسی منتظر خروجی درخواست نیست. در این مواقع از CancellationToken استفاده میکنیم.
public async Task<IActionResult> ShowAsync(CancellationToken cancellationToken)
{
await Task.Delay(30000, cancellationToken);
return View("ShowAsync");
}
دانلود فایل پاورپوینت
دانلود سورس کد پروژه از گیت هاب دانلود
سلام و ارادت استاد ارجمند
اول از همه ازتون تشکر می کنم بخاطر این بزرگواری و از خود گذشتگی .ویدیو های آموزشی با کیفیت و عالی . خسته نباشید دارم لذت می برم
فقط یک مشکلی در دانلود فایل های پاور پوینت و برخی دیگر از قالب فایل دارم انکار مشکلی در دانلود وجود دارد!!!! انگار لینک دانلود کار نمی کنه
در صورت امکان بررسی بفرمائید.
سپاس فراوان و آرزوی سلامتی و موفقیت روزافزون