Asynchronous Programming

 
 

 

Asynchronous برای فعالیت هایی که به طور بالقوه مسدود می شود، مانند زمانی است که برنامه شما به وب دسترسی دارد ضروری است. دسترسی به منابع اینترنتی گاهی اوقات آهسته یا به تأخیر می افتد. اگر چنین فعالیتی در یک فرایند همزمان متوقف شود، کل برنامه باید صبر کند. در یک فرآیند غیر همزمان، برنامه می تواند با کار دیگری که به منابع وب وابسته نیست، ادامه یابد.

 

روش Async با برنامه نویسی Multi Thread متفاوت است  به نحوی که تعداد Thread جداگانه در برنامه نویسی Multi Thread کاملا مشخص و در هنگامی که بار سیستم سبک و نیازی به چند Thread  نباشد باز هم به همان شکل تعریف شده برنامه اجرا خواهد شد اما در روش Async این پارامترها مشخص نمی شود و سیستم عامل تصمیم گیری می کند.
در Async سرور می تواند به Request های بیشتری پاسخ دهد این امر به این دلیل میسر است که هر Request منابع سیستم را تا پایان در اختیار ندارد و وظایف همیشه پیش میرود و حرکت رو به جلو وجود دارد اما در Sync وقتی ترافیک زیاد تر از حد توان باشد خطای Server Time Out رخ می دهد.

در روش های async، شما از کلمات کلیدی و انواع ارائه شده برای نشان دادن آنچه شما می خواهید، استفاده می کنید و کامپایلر بقیه را انجام می دهد.در زمانی که کنترل اجرای برنامه به یک نقطه انتظار در یک متد متوقف شده می رسد، کامپایلر ادامه عملیات دیگری یا هر آنچه که باید اتفاق بیفتد را پیگیری می کند.

کنترل بعضی از فرآیندهای معمولی مانند حلقه ها و مدیریت خطاها (مدیریت Exception ها) در کد نسخه قدیمی تر از برنامه نویسی Async کار نسبتا دشواری بود اما امروزه در روش Async این عناصر را به همان شکلی که در روش همزمان می نویسید، پیاده کنید مشکل حل می شود.

 

چه زمانی و چگونه از Async استفاده کنیم!؟

روش Async برای برنامه های کاربردی که به UI Thread دسترسی دارند، بسیار ارزشمند است، زیرا فعالیت های مرتبط با UI معمولا یک Thread را به اشتراک می گذارد. اگر یک فرآیند در برنامه همزمان، مسدود شده باشد، همه فرآیندها مسدود می شوند.

هنگامی که از روش های ناهمزمان استفاده می کنید، بعد از ارسال یک درخواست برنامه همچنان به UI پاسخ می دهد. و شما می توانید از بقیه عناصر UI استفاده کنید مثلا یک اندازه پنجره را تغییر دهید و اگر نمی خواهید منتظر پاسخ برنامه بمانید، می توانید برنامه را ببندید.

جدول زیر زمینه های مشخصی را نشان می دهد که برنامه نویسی Async پاسخگویی را درآن بهبود می بخشد.

 

 

شروع کار با Async:

در c# 5 یک رویکرد ساده برنامه نویسی async معرفی شد که در .NET Framework 4.5 و بالاتر، .NET Core و Runtime Windows پشتیبانی می شود.

اولین و مهمترین نکته : کلمه کلیدی async کلمه کلیدی await را فعال می کند. پس در اگر در تعریف یک متد از کلمه async استفاده کنیم در هنگام صدا زدن آن باید از await کمک بگیریم.وقتی ما از کلمات کلیدی async یا await استفاده می کنیم کامپایلر یک ماشین وضعیت در پس زمینه می سازد.

مثال:

static void Main()
{
    Task<string> task = WaitingAsyncCounter();
    task.Wait(200);
    AsyncCounter();
    Counter();
    var date = task.Result;
    Console.WriteLine($"\n\r*************************************************{date}");

    Console.ReadKey();
}

static void Counter()
{
    for (int i = 0; i < 100; i++)
    {
        Console.WriteLine($"{i}");
    }
}

static async void AsyncCounter()
{
    await Task.Run(() =>
    {
            Console.WriteLine("AsyncCounter is async ");
            for (int i = 0; i <= 100; i++)
            {
                Console.WriteLine($"******************{i}:void async");
            }
    });
}

private static async Task<string> WaitingAsyncCounter()
{
    await Task.Run(() =>
    {    
            Console.WriteLine("WaitingAsyncCounter is async ");
            for (int i = 0; i <= 500; i++)
            {
                Console.WriteLine($"*******{i}: async");
            }
    });
return DateTime.Now.ToShortDateString();
}

نکات مهم درمورد این مثال عبارتند از :

1- کنترل اجرای برنامه 200 میلی ثانیه منابع سیستم را در اختیار WaitingAsyncCounter قرار می دهد و بعد از آن به متد main برگشته و بقیه دستورات را  اجرا می کند.

2- متد AsyncCounter هیچ نوع داده ای  بعنوان خروجی ندارد و  void می باشد.برای متد های void از دستور wait نمی توان استفاده کرد.

3- دستور task.Result در متد main خروجی متد WaitingAsyncCounter را در متغیر date قرار میدهد و زمانیکه کامپایلر به این دستور می رسد، منتظر می ماند تا عملیات متد WaitingAsyncCounter به پایان برسد و خروجی متد را در متغیر date قرار دهد. استفاده از دستور Result بسیار مهم می باشد و در صورتیکه در جای درستی بکار نرود async در عمل کارایی لازم را ندارد.

4-در شرایطی ممکن است بخشی از برنامه برای ادامه عملیات به خروجی یک متد async نیاز داشته باشد .بعنوان مثال خروجی یک متد async پارامتر ورودی متد دیگری می باشد.در این شرایط قبل از فرستادن پارامتر به متد دوم باید به متد async فرصت اتمام عملیات را داده و منتظر دریافت نتیجه بمانیم .در اینجا باید با استفاده از دستور Result خروجی متد را دریافت کنیم.کامپایلر با رسیدن به دستور Result منتظر دریافت نتیجه متد می ماند.


آخرین بروزرسانی
۱۶ اسفند ۱۴۰۲ 
تعداد کلیک
۲,۶۰۲

فهرست نظرها و ارسال نظر جدید

نام را وارد کنید
ایمیل را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید