Asynchronous برای فعالیت هایی که به طور بالقوه مسدود می شود، مانند زمانی است که برنامه شما به وب دسترسی دارد ضروری است. دسترسی به منابع اینترنتی گاهی اوقات آهسته یا به تأخیر می افتد. اگر چنین فعالیتی در یک فرایند همزمان متوقف شود، کل برنامه باید صبر کند. در یک فرآیند غیر همزمان، برنامه می تواند با کار دیگری که به منابع وب وابسته نیست، ادامه یابد.
در روش های async، شما از کلمات کلیدی و انواع ارائه شده برای نشان دادن آنچه شما می خواهید، استفاده می کنید و کامپایلر بقیه را انجام می دهد.در زمانی که کنترل اجرای برنامه به یک نقطه انتظار در یک متد متوقف شده می رسد، کامپایلر ادامه عملیات دیگری یا هر آنچه که باید اتفاق بیفتد را پیگیری می کند.
کنترل بعضی از فرآیندهای معمولی مانند حلقه ها و مدیریت خطاها (مدیریت Exception ها) در کد نسخه قدیمی تر از برنامه نویسی Async کار نسبتا دشواری بود اما امروزه در روش Async این عناصر را به همان شکلی که در روش همزمان می نویسید، پیاده کنید مشکل حل می شود.
چه زمانی و چگونه از Async استفاده کنیم!؟
روش Async برای برنامه های کاربردی که به UI Thread دسترسی دارند، بسیار ارزشمند است، زیرا فعالیت های مرتبط با UI معمولا یک Thread را به اشتراک می گذارد. اگر یک فرآیند در برنامه همزمان، مسدود شده باشد، همه فرآیندها مسدود می شوند.
هنگامی که از روش های ناهمزمان استفاده می کنید، بعد از ارسال یک درخواست برنامه همچنان به UI پاسخ می دهد. و شما می توانید از بقیه عناصر UI استفاده کنید مثلا یک اندازه پنجره را تغییر دهید و اگر نمی خواهید منتظر پاسخ برنامه بمانید، می توانید برنامه را ببندید.
جدول زیر زمینه های مشخصی را نشان می دهد که برنامه نویسی Async پاسخگویی را درآن بهبود می بخشد.
.NET types with async methods | Windows Runtime types with async methods |
---|---|
HttpClient | SyndicationClient |
StreamWriter, StreamReader, XmlReader | StorageFile |
Synchronous and Asynchronous Operations | MediaCapture, BitmapEncoder, BitmapDecoder |
شروع کار با 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 منتظر دریافت نتیجه متد می ماند.
3,005بازدید
دیدگاه کاربران
هنوز دیدگاهی ثبت نشده است.
شما میتوانید درباره این مقاله، دیدگاه خود را ثبت کنید.