آرمان
آرمان
خواندن ۲ دقیقه·۵ سال پیش

همزمانی در Clean Code(قسمت 8)

استفاده از Async/Await

خلاصه دستورالعمل های برنامه نویسی غیرهمزمان

نام: Avoid asyinc void - اجتناب کردن از async void

  • شرح: متد های async task را به متد های async void ترجیح دهید.
  • استثنائات: async void در event handler ها استفاده میشود.

نام: Async all the way - همیشه از async استفاده کنید

  • شرح: کد های async و blocking مخلوط نکنید.
  • استثنائات: متد main برنامه console سی شارپ نسخه 7 به پایین.

نام: Configure context - تنظیم context

  • شرح:وقتی می توانید از ConfigureAwait(false) استفاده کنید.
  • استثنائات:متدهایی که نیاز به context دارند.

(غیرهمزمان) Async راه انجام کارها

  • برای بازیابی نتیجه یک task پس زمینه بجای Task.Wait یا Task.Result از await استفاده کنید.
  • برای منتظرماندن کامل شدن task بجای Task.WaitAny از await Task.WhenAny استفاده کنید.
  • برای بازیابی نتیجه چند task بجای Task.WaitAll از await Task.WhenAll استفاده کنید.
  • برای انتظار یک دوره زمانی بجای Thread.Sleep از await Task.Delay استفاده کنید.


بهترین تمرین

کلمات کلیدی async/await برای کارهای مرتبط با IO bound tasks (ارتباطات شبکه ای ، ارتباط بانک اطلاعاتی ، درخواست http ، و غیره) است. اما استفاده برای کارهای مرتبط computational bound tasks (چرخش از لیست عظیم ، پردازش تصاویر بزرگ و غیره) مناسب نسیت. زیرا thread نگهدارنده را به قسمت thread pool منتقل می کند و CPU/cores های موجود برای پردازش آن کارها(tasks) دخالتی ندارند.بنابراین ، ما باید از استفاده از Async/Await برای کارهای محاسباتی (computional bound tasks) خودداری کنیم.

برای رسیدگی به کارهای محاسباتی (computational bound tasks)،ترجیح می دهید از Task.Factory.CreateNew با TaskCreationOptions که LongRunning است ،استفاده کنید.این یک thread پس زمینه جدید را برای پردازش یک کار محدود محاسباتی سنگین و بدون رها کردن آن بهthread pool شروع می کند تا اینکه کار انجام شود.

ابزار های خودت را بشناس

چیزهای زیادی برای آموختن در مورد async و await وجود دارد و طبیعی است که کمی از منحرف شوید.در اینجا سریع به راه حل های مربوط به مشکلات رایج اشاره می شود.

راه حل هایی برای مشکلات مشترک Async

تصویر گویای همه چیز هست
تصویر گویای همه چیز هست

سند Task-based Asynchronous Pattern (TAP) را بخوانید.بسیار خوب نوشته شده است ،و شامل راهنمایی در مورد طراحی API و استفاده صحیح از async / await (از جمله لغو و گزارش پیشرفت).

بسیاری از تکنیک های جدید منتظر await وجود دارد که باید به جای تکنیک های قدیمی مورد استفاده قرار گیرند.اگر در کد async جدید خود هر یک از این مثال های قدیمی را دارید ، این کار را اشتباه انجام می دهید (TM):

تصویر گویای همه چیز هست
تصویر گویای همه چیز هست
Source
https://gist.github.com/jonlabelle/841146854b23b305b50fa5542f84b20c

منبع این بخش

AsyncAwaitconcurrencyclean codec
یک برنامه نویس که هرآنچه را که یاد میگیرد در دفترچه یادداشت ویرگولیش یادداشت میکرد(!) حتی یک خط ! تا درصورت نیاز به آن رجوع کند...
شاید از این پست‌ها خوشتان بیاید