
آموزش برنامه نویسی ناهمزمان Asynchronous Programming در دات نت
آموزش برنامه نویسی ناهمزمان Asynchronous Programming در دات نت یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی شروع به کار با برنامه نویسی ناهمزمان در دات نت است که با نام اصلی Getting Started with Asynchronous Programming in .NET از شرکت Pluralsight منتشر شده است.
برنامه نویسی ناهمزمان و یا Asynchronous چیست؟
اگر شما قرار است که عملیاتی را انجام بدهید که بیشتر با خواندن و نوشتن داده ها کار می کنند و یا اصطلاحاً I/O Bound هستند بهتر است که از Asynchronous Programming استفاده کنید. برخی از مثال هایی از عملیات I/O Bound شامل درخواست داده از طریق شبکه، دسترسی پیدا کردن به بانک اطلاعاتی و یا خواندن و نوشتن به فایل سیستم می باشند. علاوه بر این موضوع، کدهایی که اصطلاحاً CPU Bound می باشند یعنی در حال انجام محاسبات زمانبر هستند کاندیدای خوبی برای استفاده کردن از کدهای Asynchronous هستند. در زبان برنامه نویسی سی شارپ و فریم ورک دات نت مدل برنامه نویسی Asynchronous به سادگی پیاده سازی شده است. این موضوع به شما کمک می کند تا بتوانید به راحتی کدنویسی ناهمزمان انجام بدهید و با استفاده کردن از کتابخانه مبتنی بر Task ها در فریم ورک دات نت نیازهای خود در برنامه نویسی Asynchronous را پاسخگو باشید.
در فریم ورک دات نت اساس برنامه نویسی Asynchronous استفاده کردن از کلاس های Task و Task جنریک می باشند که به سادگی میتوانند امکان انجام عملیاتی به صورت Asynchronous را در اختیار ما قرار بدهند. علاوه بر این، کلید واژه های Async و Await نیز میتوانند در کنار کلاسهای Task استفاده بشوند و عملیات نوشتن کدهای Asynchronous را بیش از پیش ساده کنند. برای انجام کدهای I/O Bound یا همان عملیاتی که بیشتر با خواندن و نوشتن داده ها کار می کنند، شما اصطلاحاً یک عملیات که Task و یا Task جنریک را برمیگردانند، Await میکنید. این عملیات درون یک متد که به صورت Async تعریف شده است لحاظ می گردد.
برای کدهایی که CPU Bound هستند و محاسبات پیچیده انجام میدهند شما یک عملیاتی که در یک Background Thread اجرا شده است را Await میکنید. این Background Thread میتواند با استفاده از متد Run از کلاس Task اتفاق افتاده باشد. کلید واژه Await کار بسیار مهمی را در این روند انجام میدهد. با استفاده از کلید واژه Await شما در واقع می توانید کنترل را به Caller و یا فراخواننده متد اصلی برگردانده و UI Thread برنامه را Responsive نگه دارید. البته ذکر این نکته نیز ضروری است که برای استفاده کردن از کدهای Asynchronous در فریم ورک دات نت و برنامه نویسی همروند روش های مختلف دیگری نیز به جای استفاده کردن از کلید واژه های Async و Await وجود دارند.

در زمان استفاده کردن از عملیات Asynchronous و به کار بردن کلاس های Task و Task جنریک کامپایلر سی شارپ به سادگی کد شما را به یک State Machine و یا ماشین حالت تبدیل میکند. این State Machine باعث می شود که در زمان برخورد با کلمه کلیدی Await روند اجرای برنامه به Caller برگردانده بشود و اجرا شدن برنامه در زمان تکمیل شدن یک Background Job از سر گرفته بشود. برخی از نکات بسیار مهم که باید در رابطه با موارد استفاده Asynchronous Programming را بدانید در قسمت زیر برای شما آورده شدند.
- برنامه نویسی Asynchronous و کدهای ناهمزمان میتوانند هم برای عملیات I/O Bound استفاده بشوند و هم برای عملیات CPU Bound اما هرکدام سناریوهای منحصر به فرد خاص خود را دارند.
- کدهایی که به صورت Asynchronous نوشته میشوند از کلاس Task و یا کلاس Task جنریک استفاده میکنند. این کلاسها باعث میشوند که به سادگی بتوانیم یک عملیات را در Background اجرا کنیم.
- استفاده کردن از کلمه کلیدی Async در تعریف کردن یک متد باعث میشود که بتوانیم در بدنه آن متد از کلمه کلیدی Await استفاده کنید.
- زمانی که روند اجرای برنامه به دستور Await میرسد متد فراخوانده شده متوقف میشود و کنترل اجرا به متد فراخواننده و یا Caller برگردانده میشود. این موضوع تا زمانی اتفاق میافتد که عملیاتی که در حال Await کردن آن هستید تکمیل بگردد.
- از کلید واژه Await فقط میتوانید در متدهایی که به صورت Async این تعریف شدهاند استفاده کنید.
ضمناً ذکر این نکته نیز ضروری است که در کنار این بسته آموزشی می توانید در صورت تمایل از آموزش برنامه نویسی چند نخی Multithreading در سی شارپ از وبسایت پرووید نیز دیدن کنید.
تفاوت برنامهنویسی ناهمگام و موازی در .NET
در برنامهنویسی .NET، اجرای ناهمگام و اجرای موازی دو مفهوم مرتبط اما متفاوت هستند. در برنامهنویسی ناهمگام، هدف این است که هنگام انتظار برای تکمیل یک عملیات، اجرای برنامه بیدلیل متوقف نشود. در مقابل، برنامهنویسی موازی تلاش میکند چند عملیات را بهصورت همزمان اجرا کند و در صورت فراهم بودن منابع، از چند هسته پردازنده بهره ببرد. شناخت این تفاوت به توسعهدهنده کمک میکند برای هر نوع مسئله، روش اجرایی مناسبتری انتخاب کند.
برای مثال، هنگام دریافت اطلاعات از یک API یا خواندن داده از دیتابیس، برنامه ممکن است زمان زیادی را منتظر پاسخ بماند. استفاده از عملیات ناهمگام میتواند از مسدود شدن غیرضروری Thread جلوگیری کند. اما در محاسبات سنگین، اجرای موازی ممکن است به کاهش زمان پردازش کمک کند. البته اجرای موازی همیشه سریعتر نیست و هزینه هماهنگسازی عملیات نیز باید در نظر گرفته شود. انتخاب درست میان این رویکردها به نوع کار و محدودیتهای برنامه بستگی دارد.
آشنایی با Task Parallel Library در .NET
Task Parallel Library یا TPL مجموعهای از امکانات در .NET است که کار با Taskها و اجرای عملیات همزمان یا موازی را سادهتر میکند. با استفاده از این کتابخانه میتوان اجرای کارها را مدیریت کرد، میان چند عملیات هماهنگی ایجاد کرد و در صورت نیاز، نتیجه اجرای آنها را دریافت کرد. TPL بخش مهمی از ابزارهای برنامهنویسی همزمان در .NET محسوب میشود و در کنار async و await برای ساخت برنامههای پاسخگو و کارآمد کاربرد دارد.
درک نحوه استفاده از Taskها به برنامهنویس کمک میکند وابستگی میان عملیات مختلف را بهتر مدیریت کند. برای مثال، ممکن است یک عملیات به نتیجه عملیات دیگری نیاز داشته باشد یا چند کار مستقل بتوانند بدون انتظار برای یکدیگر اجرا شوند. انتخاب روش مناسب برای اجرای این کارها به نوع عملیات و منابع مورد استفاده بستگی دارد. آشنایی با TPL همچنین زمینه درک بهتر الگوهای پیشرفتهتر مدیریت عملیات ناهمگام و موازی در برنامههای .NET را فراهم میکند.
نکات پیشرفته مدیریت عملیات ناهمگام در .NET
با افزایش پیچیدگی برنامه، مدیریت عملیات ناهمگام به چیزی فراتر از استفاده ساده از async و await تبدیل میشود. هماهنگ کردن چند Task، مدیریت خطاهای احتمالی و تعیین رفتار برنامه هنگام لغو عملیات از جمله موضوعاتی هستند که باید بهدرستی در نظر گرفته شوند. اگر چند عملیات به یکدیگر وابسته باشند، ترتیب اجرای آنها و نحوه مدیریت نتیجه هر مرحله اهمیت زیادی پیدا میکند. طراحی مناسب این بخشها میتواند از بروز مشکلاتی مانند باقی ماندن عملیات غیرضروری یا مدیریت نادرست خطاها جلوگیری کند.
یکی دیگر از موضوعات مهم، تشخیص زمان مناسب برای استفاده از برنامهنویسی ناهمگام یا موازی است. اجرای چند عملیات بهصورت همزمان ممکن است مصرف منابع را افزایش دهد و در برخی شرایط فشار بیشتری به سیستم وارد کند. به همین دلیل، توسعهدهنده باید علاوه بر شناخت APIهای مربوطه، رفتار برنامه را در شرایط واقعی نیز بررسی کند. تسلط بر این نکات برای برنامهنویسانی که با سرویسهای شبکه، دیتابیسها و پردازشهای چندمرحلهای در .NET کار میکنند، اهمیت زیادی دارد.
سرفصل مطالب آموزش ویدئویی برنامه نویسی ناهمزمان (Asynchronous Programming) در دات نت
فصل اول: مقدمه دوره آموزشی
- مقدمه دوره آموزشی
فصل دوم: بررسی کردن Asynchronous Programming و یا برنامه نویسی غیر همزمان در فریمورک دات نت با استفاده از Async و Await
- راه اندازی کردن فایلهای مربوط به این آموزش
- معرفی کردن Async و Await در فریمورک دات نت
- درک کردن یک Continuation
- ایجاد کردن اولین متد Asynchronous
- مدیریت کردن یک Exception
- استفاده از بهترین روشها
فصل سوم: استفاده کردن از Task Parallel Library در فریم ورک دات نت
- معرفی کردن یک Task
- به دست آوردن Result مربوط به یک Task
- مدیریت Success و Failure در روند اجرا شدن Task ها
- پیاده سازی Task Cancellation
- دانستن اینکه آیا همه Task ها و یا حداقل یکی از آنها با موفقیت انجام شده باشد
- محاسبه کردن Result مربوط به Task ها از قبل
- پردازش کردن Task ها در زمانی که تکمیل میشوند
- کنترل کردن اجرای Continuations ها بر روی Context های مختلف
- مهمترین نکات مربوط به این فصل
فصل چهارم: برنامه نویسی موازی با استفاده از Parallel Extensions ها
- معرفی کردن Parallel Extensions ها
- پردازش کردن یک Collection از دادن به صورت موازی
- کار کردن با متغیر ها و کالکشن های اشتراکی
- جمع بندی
فصل پنجم: نکات پیشرفته در برنامه نویسی غیر همزمان
- معرفی مباحث پیشرفته
- گزارش گرفتن از روند پیشرفت اجرای یک Task
- استفاده کردن از Task Completion Source
- کار کردن با Attached Task ها و Detached Task ها
- تئاثیر استفاده کردن از Async و Await
- بررسی بن بست و یا Deadlock
- کار کردن با Stream های Asynchronous
- جمع بندی دوره آموزشی







