refactor یک برنامه sync به async در ASP.NET - بخش اول

در این مقاله که در دو بخش تنظیم گردیده است با اصلاح مجدد (refactor) یک برنامه وب همزمان (synchronous) به ناهمزمان (asynchronous) در ASP.NET آشنا خواهیم شد.این مطلب توسط Matthew Jones در CodeMash 2019 ارائه گردیده است.چرا برنامه نویسی Asynchronous را پیاده سازی می کنیم؟پیشنهاد میشه ابتدا مطلب" تفاوت بین Asynchronous و Multi-Threading" رو مطالعه کنید.یکی از نادرست ترین جنبه های برنامه نویسی asynchronous در دات نت این است که افراد زیادی احساس می کنند که ظاهرا performance را بهبود می بخشد.اما باید بهتون بگم که سخت در اشتباه هستید و برنامه نویسی asynchronous باعث نمی شودکه کد شما سریعتر اجرا شود.آنچه که برنامه نویسی asynchronous واقعاً انجام می دهد ، افزایش میزان درخواستهایی است که می توان همزمان با همان منابع به کار برد.همین مقدار threads می توانند درخواستهای همزمان بیشتری را در یک سیستم asynchronous نسبت به نوع synchronous انجام دهند.به طور خلاصه ، برنامه نویسی Asynchronous عملکرد را بهبود نمی بخشد بلکه باعث بهبود کارایی می شودخب بیایید این را با استفاده از یک قیاس ، که همیشه یک روش کاملا عاری از خطا برای نشان دادن یک ایده پیچیده است ثابت کنیم:یک رستوران داریم. در این رستوران وقتی سفارشات داده می شوند ، آنها برای آشپزی به آشپزخانه تحویل داده می شوند. آشپزخانه دارای یک دسته آشپز است که کار آن تهیه غذای مورد نیاز برای هر سفارش است. دو نوع آشپزخانه وجود دارد که می توانیم از آنها استفاده کنیم: synchronous و asynchronous.در یک آشپزخانه synchronous ، هر آشپز در هر زمان مشخص یک سفارش دریافت می کند. آنها سپس باید این دستورالعمل را تماماً به تنهایی انجام دهند. این بدان معناست که اگر یک مورد نیاز داشته باشد از اجاق گاز استفاده کند، در مدت پخت و پز آشپز باید صبر کند و در این مدت کار دیگری نمی تواند انجام دهد.از این رو این آشپزخانه می تواند فقط مقدار X سفارشات را همزمان انجام دهد ، جایی که X تعداد آشپزها در آشپزخانه است.در آشپزخانه asynchronous آشپزها وقت بیکار نخواهند داشت. آنها ممکن است یک سفارش دریافت کنند و شروع به درست کردن آن کنند ، اما اگر نکته ای پیش بیاید که باید منتظر بمانند کاری انجام شود (پخت و پز در فر و غیره) باید بروند و کار دیگری انجام دهند. این آشپزخانه می تواند سفارشات بیشتری نسبت به آشپزها داشته باشد ، زیرا هیچ آشپزی نمی تواند در انتظار وقوع چیزی باشد. به این ترتیب ، تعداد سفارشات انجام شده آشپزخانه افزایش می یابد ، حتی اگر هر آشپز به سرعت معمول کار نمی کند.اصول برنامه نویسی asynchronousاز آنجا که این ایده را به خاطر می آوریم که هدف از برنامه نویسی asynchronous در ASP.NET بهبود کارآیی است ، می توانیم در مورد برخی از اصول اساسی که باید هنگام اجرای آن استفاده کنیم ، صحبت کنیم. چند نکته برای به یاد آوردن وجود دارد:پیاده سازی Asynchronous به صورت Multi-Threadedتفاوت بین Process و Thread چیست؟تفاوت بین Task و ThreadAsynchronous Is Not Multi-threadingیادآوری این نکته ضروری است که کد asynchronous ، همان کدی نیست که ازmulti-threading استفاده می کند.تفاوت بین Asynchronous و Multi-ThreadingAsync Works on I/O Bound, Not CPU-Bound, Tasksاز آنجا که برنامه نویسی asynchronous در مورد tasks است، باید مشخص کنیم که چه نوع کارها از استفاده از آن سود می‌برند. گفته می‌شود که این کارها I/O-bound هستند، به طوری که آن‌ها را از وظایف وابسته به CPU متمایز می‌کند.وظایف CPU-bound وظایفی هستند که به سرعت محاسبه دستگاه برای اجرای سریع مانند محاسبات پیچیده ریاضی متکی هستند. محاسبات گفته شده زمان پردازنده را اشغال می کند و در حالی که آنها در حال اجرا هستند پردازنده، دیگر نیازی به انتظار برای ورودی های دیگر ندارد. این نوع کارها از برنامه نویسی asynchronous بهره نمی برد.وظایف مربوط به I / O کارهایی هستند که نیاز به پاسخی از منابع خارجی دارند. چنین منابع خارجی ممکن است شامل یک بانک اطلاعاتی ، یک سرویس ، یک API REST یا موارد دیگر باشد. هنگام برقراری تماس با این منابع ، پردازنده غالباً باید "منتظر بماند" که آنها پاسخ دهند.Async مانند ویروس پخش می شودهنگامی که فرد شروع به اجرای برنامه نویسی asynchronous در پایگاههای کد NET. می کند ، تمایل دارد به سرعت به کدهای اطراف خود انتشار یابد.این یعنی ما نباید کدهای synchronous و asynchronous را بدون دانستن اینکه دقیقا چه پیامدهایی بر روی آن‌ها وجود دارد، ترکیب کنیم.Return Typesکد Asynchronous در NET. تنها از سه نوع Return Types استفاده می کند:Task:Represents work being done that will eventually return control to the caller.Task&lt;T&gt;:Represents work being done that will eventually return an object of type T to the caller.void:Makes the method a true fire-and-forget method.با این حال ، تعداد موارد معتبر استفاده برای بازگشت void به طرز چشمگیری کم است.این امر در درجه اول به این دلیل است که ، هنگام بازگشت void ، هیچ تصوری از این که این متد به پایان برسد ، نخواهد بود.بنابراین بهترین توصیه این است که ازخروجی نوع async void استفاده نشود (اگرچه یک استثناء قابل توجه وجود دارد ، و آن event handlers است).به عنوان یک قانون ، async void برای event handler ها یا متد های سطح بالا هستند که اجازه پردازش به Asynchronous method میدهند.دستورالعمل Refactoringدر این دیتا مدل object اصلی یک کاربر می باشد. کاربران دارای آلبوم و پست هستند و آلبوم ها حاوی عکس هستند.ما باید refactoring را در پایین ترین سطح معماری داده شروع كنیم ، كه در این حالت Photo است این امر به این دلیل است که Photo هیچ وابستگی به سایر اشیاء داده ندارد. از آنجا که چنین وابستگی هایی وجود ندارد ، وقتی ما عکس را refactor می کنیم ، به احتمال زیاد هنوز نیازی به نگرانی در مورد مشکل ویروس نخواهیم داشت.خلاصهاجرای برنامه نویسی asynchronous در ASP.NET به یک سیستم اجازه می دهد تا درخواست های بیشتری را در همان سخت افزار انجام دهد و باعث افزایش توان (و نه عملکرد) سیستم مذکور شود. ما این کار را با کپسوله کردن وظایف I / O انجام می دهیم. Asynchronous مانند ویروس گسترش می یابد ، و اگرچه این به طور معمول چیز خوبی است ، شما باید تصمیم بگیرید که در هنگام تصمیم گیری در مورد برنامه خود ، اجرای آن را در نظر داشته باشید.در پست بعدی ، یک برنامه وب همزمان ASP.NET کار خواهیم کرد و آن را کاملاً به یک برنامه asynchronous تبدیل می کنیم.