دسته بندی ها
03:20 1398/08/05

تفاوت برنامه نویسی همگام (sync) و ناهمگام (async) چیست ؟

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : Asp.net Mvc Asp.net Core سی شارپ

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 5362
هوش مصنوعی

پاسخ هوش مصنوعی

برنامه نویسی همگام (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) بسیار مناسب تر است.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 13:54 1398/08/05

در مورد سوال اولتون که چه زمانی بهتره از برنامه نویسی همگام استفاده بشه و چه زمان ناهمگام کلا پیشنهاد مایکروسافت اینه که تا حد امکان از برنامه نویسی ناهمگام یا 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);

 

در مجموع میشه گفت برنامه نویسی ناهمگام بهینه تر هست و برنامه نویسی مدرن و جدید داره به این سمت میره. برای اطلاعات بیشتر این لینک رو مطالعه بفرمایید.

ویرایش شده در یکشنبه 5 آبان 1398 ساعت 13:58:54
به این پاسخ امتیاز بدهید    2
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود