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 برگشته و بقیه دستورات را اجرا می کند.