تفاوت برنامه نویسی همگام (sync) و ناهمگام (async) چیست ؟
توی انتیتی فریم ورک کور برای عملیات CRUD یا همون Edit و Update و Insert هم حالت sync وجود داره و هم حالت Async. حتی دستور SaveChange هم به صورت SaveChangeAsync وجود داره.
حالا سوال من اینه که هنگام برنامه نویسی با سی شارپ یا Asp.net core چه زمانی بهتره از برنامه نویسی همگام یا Sync استفاده بشه و چه زمانی بهتره از برنامه نویسی ناهمگام یا Async استفاده بشه ؟ ضمنا از لحاظ کارایی با Performance چه تفاوت هایی رو با هم دارن این 2 حالت ؟
اگر ما به صورت Sync انجام بدیم دستورات رو چه وقفه ای و در کجای سیستم پیش میاد ؟
پاسخ هوش مصنوعی
برنامه نویسی همگام (Sync) و ناهمگام (Async) دو رویکرد مختلف برای اجرای عملیات در برنامه نویسی هستند.
برنامه نویسی همگام (Sync): در این نوع برنامه نویسی، هر عملیات باید قبل از اینکه برنامه به مرحله بعدی برود، کامل شود. به عبارت دیگر، وقتی که یک دستور همگام اجرا می شود، از آنجایی که احتمالاً نیاز به زمان دارد (مانند ارتباط با پایگاه داده)، برنامه تا زمان تکمیل آن عملیات متوقف می شود. این نوع برنامه نویسی ساده است و کد را به راحتی قابل متوجه می کند اما در مواردی که زمان انتظار زیاد است، می تواند باعث کاهش کارایی و تجربه کاربری نامطلوب شود.
using (var context = new MyDbContext())
{
var entity = new MyEntity { Name = "Sample" };
context.MyEntities.Add(entity);
context.SaveChanges(); // همگام
}
برنامه نویسی ناهمگام (Async): این نوع برنامه نویسی به شما اجازه می دهد تا چندین عملیات را به صورت همزمان اجرا کنید. با استفاده از کلمه کلیدی `async` و `await`، می توانید در حین انتظار برای تکمیل یک عملیات (مانند ذخیره سازی داده ها) به انجام سایر کارها ادامه دهید. این رویکرد معمولاً موجب بهبود عملکرد و تجربه کاربری بهتر می شود، زیرا نمی گذارد که برنامه به طور کامل متوقف شود و مکانیزم های بهتری برای مدیریت بار کاری فراهم می کند.
using (var context = new MyDbContext())
{
var entity = new MyEntity { Name = "Sample" };
context.MyEntities.Add(entity);
await context.SaveChangesAsync(); // ناهمگام
}
وقتی که شما از روش همگام (Sync) استفاده می کنید، در واقع منتظر خواهید ماند تا عملیات پایگاه داده (مانند واکشی اطلاعات یا ذخیره سازی آنها) کامل شود. این ممکن است باعث وقفه در رابط کاربری شود و باعث شود که برنامه به نظر کندی داشته باشد. به همین دلیل برای برنامه های وب و کاربر محور، معمولاً ترجیح داده می شود که از روش ناهمگام (Async) استفاده کنید.
از لحاظ کارایی و عملکرد، استفاده از روش ناهمگام (Async) به شما اجازه می دهد تا از منابع بهتری استفاده کنید و به کاربر این امکان را بدهید که در حین انتظار برای پاسخ، به دیگر بخش های برنامه دسترسی داشته باشد. بنابراین، در زمانی که امکان وجود تاخیر زیاد وجود دارد، مانند ذخیره اطلاعات بزرگ در پایگاه داده یا فراخوانی API های خارجی، استفاده از روش ناهمگام (Async) بسیار مناسب تر است.
در مورد سوال اولتون که چه زمانی بهتره از برنامه نویسی همگام استفاده بشه و چه زمان ناهمگام کلا پیشنهاد مایکروسافت اینه که تا حد امکان از برنامه نویسی ناهمگام یا Async استفاده بشه و بسیاری از متدهایی که ایجاد شده خصوصا متدهای Identity فقط حالت Async دارن و حالت همگام یا Sync رو براشون ایجاد نکرده.
چه زمانی از برنامه نویسی ناهمگام یا Async استفاده کنیم
در رابطه با سوال بالا باید توضیح بدم خدمتتون که شما فرض کنید یک سری کد که قراره عملیات زیاد و سنگینی رو توی دیتابیس انجا بده در نظر بگیرید. شما فرض کنید هم زمان با این کدها کارهای دیگه ای هم قرار باشه توی سرور شما یا دیتابیس شما انجام بشه. خب قطعا در این حالت وقتی که اون عملیات سنگین انجام میشه تا زمانی که عملیات به پایان برسه یک وقفه ای توی کار سرور ایجاد میشه یا عملا لحظاتی سرور هنگ میکنه.
ولی وقتی شما به صورت ناهمگام یا Async اون کدها رو اجرا کنید سرور یک نخ یا Thread رو به اون دسته عملیات اختصاص میده و تمام توان سرور صرف انجام اون عملیات نمیشه و عملا کارها روان تر و بهتر انجام میشه.
مثلا قطعه کد زیر نمونه ای از برنامه نویسی ناهمگام در Asp.net core هست.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByEmailAsync(model.Email);
}
return View("Index");
}
همونطوری که مشاهده می کنید Action با کلمه کلیدی async مشخص شده و نوع اکشن هم با Task مشخص شده. عبارت Task یعنی سرور وقتی میخواد این اکشن رو اجرا کنه یه نخ جدید رو ایجاد میکنه و در صورتی که عملیات موجود در این اکشن زمان بر بود تمام توان سرور رو نمیده به این اکشن.
در ادامه هم در همین اکشن دستور زیر رو داریم که احتمال داره زمان زیادی رو از سرور بگیره و با کلمه await مشخص شده
var user = await _userManager.FindByEmailAsync(model.Email);
در مجموع میشه گفت برنامه نویسی ناهمگام بهینه تر هست و برنامه نویسی مدرن و جدید داره به این سمت میره. برای اطلاعات بیشتر این لینک رو مطالعه بفرمایید.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- مشکل تاریخ شمسی در سی شارپ
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- نمایش گزارش stimulsoft روی کلاینت
- آپلود فایل در Asp.net core چگونه است؟