بررسی برنامه نویسی async/await و asynchronous در ASP.net MVC

پنجشنبه 25 خرداد 1396

هدف اصلی این مقاله آموزش مفهوم و نحوه استفاده از برنامه نویسی async/await یا asynchronous است و در این مقاله به کمک یک مثال عملی، به آموزش این نوع های برنامه نویسی می پردازیم.

بررسی برنامه نویسی async/await و asynchronous در ASP.net MVC

در این مقاله یک برنامه ساده MVC ساخته ایم که به راحتی مفهوم و روش استفاده از برنامه نویسی async/await یا asynchronous را در آن آموزش داده ایم.


Async

کلمه کلیدی Async برای فراخوانی یک تابع یا متد به صورت asynchronous استفاده می شود.


Await

کلمه کلیدی Await را زمانی استفاده می کنیم که به نتیجه یک تابع یا متد نیاز داریم و این تابع یا متد برای ارائه این نتیجه نیازی به مسدود کردن متد یا تابع دیگری ندارد.

برنامه نویسی Asynchronous

منظور از برنامه نویسی Asynchronous همان برنامه نویسی به صورت parallel  (موازی) است. با استفاده از برنامه نویسی Asynchronous، کامپایلر می توان چندین تابع یا متد را به صورت همزمان و بدون مسدود کردن تابع یا متد دیگری اجرا کند.

ما سه متد در این برنامه طراحی کرده ایم و برای اجرای هر کدام از این متد ها یک میزان زمان مشخص به عنوان زمان اجرای آنها در نظر گرفته ایم.


مرحله 1 – ساخت یک برنامه جدید MVC با نام Async

از منو بالا گزینه File را انتخاب کرده و سپس روی گزینه New Project کلیک کنید. در پنجره باز شده از سمت چپ صفحه Visual C# را گسترش داده و گزینه Web را انتخاب کنید و در قسمت نام برنامه هم Async را وارد کنید و سپس کلید Ok را کلیک کنید.

پنجره ایی با نام New Project باز می شود که در داخل آن نوع های مختلفی برای ساخت یک پروژه وجود دارد. گزینه MVC را انتخاب کنید، در پایین چک باکس MVC تیک می خورد سپس روی Change Authentication کلیک کرده و گزینه No Authentication را انتخاب کنید.



مرحله 2 – افزودن متد های synchronize و asynchronize

یک اکشن متد با نام GetList به کنترلر Home اضافه کنید.

public ActionResult GetList() {  
    //Create a stopwatch for getting excution time  
    var watch = new Stopwatch();  
    watch.Start();  
    var country = GetCountry();  
    var state = GetState();  
    var city = GetCity();  
    watch.Stop();  
    ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;  
    return View();  
}  

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

یک اکشن متد با نام GetListAsync به کنترلر Home اضافه کنید.

public async Task < ActionResult > GetListAsync() {  
    //Create a stopwatch for getting excution time  
    var watch = new Stopwatch();  
    watch.Start();  
    var country = GetCountryAsync();  
    var state = GetStateAsync();  
    var city = GetCityAsync();  
    var content = await country;  
    var count = await state;  
    var name = await city;  
    watch.Stop();  
    ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;  
    return View();  
}  

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

-  async برای فراخوانی متد GetListAsync به صورت asynchronous است.

- await برای اجرای متدهای GetCountryAsync،  GetStateAsync و GetCityAsync به صورت موازی استفاده می شود تا این متد ها به صورت همزمان اجرا شوند و یکدیگر را مسدود نکنند.

متد های زیر را که در GetList و GetListAsync استفاده شده بود، به برنامه اضافه کنید.

#region-- > GetCountry Methods  
for GetList && GetListAsync  
public string GetCountry() {  
    Thread.Sleep(3000); //Use - when you want to block the current thread.  
    return "India";  
}  
public async Task < string > GetCountryAsync() {  
    await Task.Delay(3000); //Use - when you want a logical delay without blocking the current thread.  
    return "India";  
}#endregion  
# region-- > GetState Methods  
for GetList && GetListAsync  
public string GetState() {  
    Thread.Sleep(5000); //Use - when you want to block the current thread.  
    return "Gujarat";  
}  
public async Task < string > GetStateAsync() {  
    await Task.Delay(5000); //Use - when you want a logical delay without blocking the current thread.  
    return "Gujarat";  
}#endregion  
# region-- > GetCity Methods  
for GetList && GetListAsync  
public string GetCity() {  
    Thread.Sleep(6000); //Use - when you want to block the current thread.  
    return "Junagadh";  
}  
public async Task < string > GetCityAsync() {  
    await Task.Delay(6000); //Use - when you want a logical delay without blocking the current thread.  
    return "Junagadh";  
}#endregion  

بعد از اجرای متد synchronize می بینیم که اجرای این متد 14002 میلی ثانیه زمان برده است.




ولی بعد از اجرای متد synchronize می بینیم که اجرای این متد 6012 میلی ثانیه زمان برده است.


آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید