مرجع مقالات کاربردی طراحی اپلیکیشن

شرح کامل مقالات طراحی اپلیکیشن

مرجع مقالات کاربردی طراحی اپلیکیشن

شرح کامل مقالات طراحی اپلیکیشن

شرح کامل مقالات طراحی اپلیکیشن

  • ۰
  • ۰

پیاده سازی Async Await


مقصود از تایپ کردن این مقاله، شناسایی اشتباهات و طراحی اپلیکیشن مشکلات رایجی میباشد که هنگام پیاده سازی صورت میدهد، چون Async / Await یک گفت و گو بغرنج میباشد و حتی یک خطا خرد یا این که پیاده سازی غلط باعث به عدم ثبات سیستم ها می‌گردد. ایده این وجود ندارد که چرخ را مجدد ابداع کنیم، بلکه تصاحب شایسته ترین طریق ها و آیین نامه های به اشتراک گذارده گردیده ‌ی دولت ها بزرگتر میباشد.


خلال این برای ما اصلی میباشد که اصول را به طور کاملً رعایت کنیم و با احتیاط از این دستور کار ها تبعیت کنیم. همگی ما تحت عنوان یک دسته بایستی باور نتایج کنیم که از این مورد ها به صدق به کار گیری میکنیم.

مباحث

● خودداری ازاستفاده کورکورانه از Async/Await درهرجا

● راهنمای همت پسوند Async بوسیله Async

● استعمال از ()Task.FromResult درصورت وجود مقدار بازگشتی و به کارگیری از  Task.CompletedTask() درصورت نبود مقدار بازگشتی، درهنگام پیاده سازی Task اساسی

● نظارت کنسل توکن، یک پارامترتکمیلی برای کنسل task/request موءثر خواهد بود

● به مکان به کار گیری از .Result ، ازGetAwaiter().GetResult استعمال فرمائید. این شغل تأثیر متعددی در مدیر ایرادات و خطاهای تجمعی دارااست. کوشش فرمایید از این نمایش اجتناب نمایید. به جهت دعوا Synchronization، در یک شرایط قفل‌گردیده قرارمی گیرد.

● زمانی به sync context نیاز ندارید از ConfigureAwaiter(false) به کارگیری نمائید.

● ازreturn برای فرمان using به کارگیری نکنید.

● ازEF نمی قدرت به صورت برابر (parallel) بهره برد. await.Task.WhenAll یا این که WhenAny. زمانی که ما از EF توسط یک مقر داده به کار گیری می‌کنیم ، امن نیستند. از parallel تنها در مواقعی که دارنده فن ایمن می‌باشند به کار گیری فرمائید.

آیتم اولیه: سیاق Async در یک روال void فراخوانی می‌گردد

استعمال خطا

public static async Task FooAsync() {
// some async code here...
await Task.Delay(10000);
}
public void ThisWillNotWaitForAsyncCodeToComplete() {
try {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
FooAsync();
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
} catch (Exception ex) {
//The below line will never be reached
Console.WriteLine(ex.Message);
}
}
به کار گیری صحیح

public static async Task FooAsync() {
await Task.Delay(10000);
}
public async Task ThisWillNotWaitForAsyncCodeToCompleteAsync() {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
await FooAsync();
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
}
تغییراتی که می بایست با تمرکز به آنها اعتنا خواهد شد:

FooAsync() -1با به کارگیری از await فراخوانی میگردد.

 -2متد دارنده async Task درsignature میباشد.

سود

 -1حلقه Async / await به صدق دنبال گردیده

Parent thread -2 معطل تکمیل child thread خواهد بود درصورت جاری ساختن هرگونه دیتابیس یا این که عملیات اتفاق افتاد، parent thread قبلی ازترک کردن درانتظار اتمام عمل می‌ماند

 -3میزان توجه در‌این عمل بالا میباشد

آیتم دوم: واژه کلیدی \"async\" به کارگیری نشده و شی \"task\" بازگردانده نمیشود.

به کارگیری خطا

public static Task BarAsync() {
// some async code here...
return Task.Delay(10000);
}
public void ThisWillNotWaitForAsyncCodeToComplete() {
try {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
BarAsync();
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
} catch (Exception ex) {
//The below line will never be reached
Console.WriteLine(ex.Message);
}
}
استعمال صحیح

public static async Task BarAsync() {
await Task.Delay(10000);
}
public async Task ThisWillNotWaitForAsyncCodeToCompleteAsyncAsync() {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
await BarAsync();
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
}
تغییراتی که بایستی با تمرکز دقت خواهد شد:

FooAsync() -1 از async استعمال می نماید و task را برنمی گرداند.

2- ThisWillNotWaitForAsyncCodeToCompleteAsync() با به کارگیری از await، FooAsync()را فراخوانی می نماید.

سود

1- رینگ Async / await به صحت دنبال گردیده

2- Parent thread معطل تکمیل child thread خواهد بود. درصورت اجرا هرگونه دیتابیس یا این که عملیات روی داد، parent thread پیشین ازترک کردن معطل اتمام کارمی ماند.

3- معیار توجه در‌این شغل بالا میباشد

گزینه سوم: اسلوب تحت عنوان \"async Task\" نشان گذاری شد‌ه‌است البته هیچ روال async ای در باطن فراخوانی نمیشود.

به کار گیری خطا

Public void Foo() {}
Public void Bar() {}
public async Task FakeAsyncMethod() {
Foo();
Bar();
Return Task.CompletedTask;
}
به کار گیری صحیح

Public void Foo() {}
Public void Bar() {}
public void FakeAsyncMethod() {
Foo();
Bar();
}
تغییراتی که بایستی با تمرکز اعتنا خواهد شد:

1- حذف async task از ()FakeAsyncMethod

2- حذف امر return task

سود

1- به صورت معمول روال sync را همانگونه که انتظار می‌رود فراخوانی نمائید.

2- معیار توجه در‌این فعالیت بسیار اساسی میباشد.

آیتم چهارم: async به مکان به کارگیری ازawait، blocking call داراست

به کار گیری خطا

public static async Task FooAsync() {
await Task.Delay(10000);
}
public void ThisWillNotWaitForAsyncCodeToCompleteAsync() {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
FooAsync().Result;
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
}
به کارگیری صحیح

public static async Task FooAsync() {
await Task.Delay(10000);
}
public void ThisWillNotWaitForAsyncCodeToCompleteAsync() {
Console.WriteLine(\"Before : \" + DateTime.Now.ToString());
await FooAsync();
Console.WriteLine(\"After : \" + DateTime.Now.ToString());
}
تغییراتی که می بایست با تمرکز اعتنا خواهد شد:

1- افزودن await در FooAync() برای تعقیب کردن زنجیره مطلوب async/await

2- استعمال از .Result مزیت async را از در بین میبرد.

سود

1- اسلوب Async را می بایست طبق پیشنهاد و شیوه درست جاری ساختن آن، فراخوانی نمائید.

2- واحد سنجش اعتنا این نصیب اصلی میباشد

گزینه پنجم: مسدود سازی متدasync با به کارگیری از .Wait

به کار گیری خطا

public async Task FooAsync(string id) {

some more
function code without any await operation inside…
await Task.Delay(10000);
}
public void Bar() {
console.writeline(“Hello world”);
FooAsync().Wait();
}
به کارگیری صحیح

public async Task FooAsync(string id) {

some more
function code without any await operation inside…
await Task.Delay(10000);
}
public async Task BarAsync() {
console.writeline(“Hello world”);
await FooAsync();
}
تغییراتی که بایستی با تمرکز دقت خواهد شد:

1- از  async awaitدر BarAsync() به کار گیری نمائید تا الگوی صحیح async/await را دنبال نمایید.

سود

1- متدasync بایستی به روشی که بایستی صورت پذیرد، فراخوانی خواهد شد به مکان آنکه به تحمیل به sync تبدیل شوند ورشته فعلی را مسدود نماید.

2- معیار توجه این نصیب اصلی میباشد

آیتم ششم: ساخت task برای سیاق sync و انتظار برای task

به کار گیری خطا

public void SomeMethod1() {

some
function code….
Var task = Task.Run(() => SomeMethod2);
task.Wait();…
some functional code….
}
public void SomeMethod2() {

Some
function code goes here...
}
به کارگیری صحیح

public void SomeMethod1() {

some
function code….
SomeMethod2();…
some functional code….
}
public void SomeMethod2() {

Some
function code goes here...
}
تغییراتی که می بایست با تمرکز دقت گردد:

به صورت معمول از روال sync به روشی که گزینه انتظار میباشد استعمال فرمائید. ساختن یک task و انتظار برای task تنها هدر دادن یک thread مازاد در pool میباشد که به عبارتی فعالیت را می اقتدار در خویش thread مهم اجرا بخشید.

سود

1- سعی باصرفه گردیده برای ساخت task هنگامی متدی بایستی چشم به راه بماند.

2- ترازو توجه این قسمت اساسی میباشد.

گزینه هفتم: بازیافتن فیض یکسری task

به کارگیری غلط

public async Task < string > FooAsync() {
string result = string.empty;…
some
function code…
return result;
}
public async Task < string > BarAsync() {
string result = string.empty;…
some
function code…
return result;
}
public void ParentMethod() {
var task1 = FooAsync();
var task2 = BarAsync();
Task.WaitAll(task1, task2);
}
به کار گیری صحیح

public async Task < string > FooAsync() {
string result = string.empty;…
some
function code…
return result;
}
public async Task < string > BarAsync() {
string result = string.empty;…
some
function code…
return result;
}
public async Task ParentMethod() {
var task1 = FooAsync();
var task2 = BarAsync();
await task.WhenAll(task1, task2);
}
تغییراتی که می بایست با تمرکز صورت پذیرد:

ما بایستی از میکس شدن blocking& unblocking کد پرهیز کنیم. Task.WaitAll یک اسم گذاری blocking میباشد در حالی که Task.WhenAll،  nonblockin میباشد و معنای async را محافظت می نماید.

سود

1- کد با صرفه شد‌ه‌است و طبق دستور کار های نرم افزار نویسی async / await برای دوری از بسته شدن نامگذاری ها فعالیت می نماید.

2- ترازو توجه این نصیب بسیار اصلی میباشد

گزینه هشتم: نسخه  Syncزمانی به کار گیری می‌شود که Async در دسترس باشد.

استعمال خطا

public bool CheckLabelAlreadyExist(string labelName, Guid facilityKey, int labelTypeCode) {
return GetQueryable().Any(x => x.DescriptionText == labelName && x.FacilityKey == facilityKey && x.LabelTypeCode == labelTypeCode);
}
به کار گیری صحیح

public async Task < bool > CheckLabelAlreadyExist(string labelName, Guid facilityKey, int labelTypeCode) {
return await GetQueryable().AnyAsync(x => x.DescriptionText == labelName && x.FacilityKey == facilityKey && x.LabelTypeCode == labelTypeCode);
}
مقررات نامگذاری سیاق:

1- کلیه متدهای async می بایست دارنده پسوند \"async\" در اسم روال باشند تا خوانایی سهل گردد و تمایز در میان متدهای sync و async وجود داشته باشد.

2- داشتن \"async\" در متدها، آن را آشکار کرده و احتمال نادرست در پیاده سازی را کاهش می‌دهد.

فیض گیری

async / wait شایسته ترین عمل برای task های محصور به IO (پیوندها کانال ای ، پیوندها مقر داده ، درخواست http و غیره) میباشد. البته بهتر وجود ندارد که درtaskهای محاسباتی انجام خواهد شد (پیمایش لیست تبارک ، پردازش یک تصویر تبارک و غیره). زیراthreadنگهدارنده را از  thread pool  آزاد می نماید و CPU/coreهای دردسترس، برای پردازش آن درtaskها به کارگرفته نمی‌شوند. بدین ترتیب ، می بایست از استفادهAsync / Awaitبرایtaskهای محاسباتی دوری گردد.
برای پرداختن به  taskهای محاسباتی، عالی میباشد ازTask.Factory.CreateNew  باTaskCreationOptions  کهLongRunningاست، به کارگیری کنیم. با به کار گیری از این شیوه تا مجال   اجرا  task، یکbackground threadجدید برای پردازش یک  taskسنگین محاسباتی فارغ از ول کردن دوباره آن ازthread pool، آغاز میشود.
 

  • ۰۱/۰۲/۲۹
  • شایلین عباسی

طراحی اپلیکیشن

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی