همانطور که در بالا اشاره کردید "در مثال فوق، نحوهی ترکیب دو Task را توسط Task.WhenAll .... "در برخی موارد استفاده از async باعث افزایش کارآیی نیز میشود، آیا در موردی که مثلا من در یک اکشن برای انجام کاری نیاز به 4 درخواست مجزا به دیتابیس دارم و بعد از گرفتن نتیجه این 4 درخواست میتوانم درخواست نهایی را به دیتابیس بفرستم، استفاده از async باعث افزایش کارایی نیز میشود ؟
برای تشریح بهتر من نتیجه تست خود را اضافه میکنم. من از mvc5 و EF6 database first استفاده کردم.
حالت sync :
var watch = Stopwatch.StartNew();
int actionId = db.CF_AccessLevel.Where(a => a.Name.ToLower().Trim() == "Edit").Select(a => a.CF_AccessLevelId).Single();
int moduleItemId = db.CF_ModuleItem.Where(m => m.Title.ToLower().Trim() == "license".ToLower().Trim()).Select(m => m.CF_ModuleItemId).Single();
int groupRoleId = db.Users.Where(u => u.UserId == 1).Select(u => u.UserRoleId).Single();
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
حالت async:
var watch = Stopwatch.StartNew();
var something = Task<int>.Factory.StartNew(() => db.CF_AccessLevel.Where(a => a.Name.ToLower().Trim() == "Edit").Select(a => a.CF_AccessLevelId).Single());
something.Wait();
int actionId = something.Result;
var something1 = Task<int>.Factory.StartNew(() => db.CF_ModuleItem.Where(m => m.Title.ToLower().Trim() == "license".ToLower().Trim()).Select(m => m.CF_ModuleItemId).Single());
something1.Wait();
int moduleItemId = something1.Result;
var something2 = Task<int>.Factory.StartNew(() => db.Users.Where(u => u.UserId == 1).Select(u => u.UserRoleId).Single());
something2.Wait();
int groupRoleId = something2.Result;
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
در هر حالت بعد از انجام 3 درخواست ، درخواست نهایی را به سرور میفرستم (در کدهای بالا موجود نیست)
و نتیجه با جزئیات را در آخر اضافه کرده ام :
اما خلاصه میانگین روش sync 222 ms و روش async 191.75ms میباشد حدود 35.25ms تفات وجود دارد.
حال آیا تفاوت معنی دار میباشد؟ آیا کد async نوشته شده صحیح است؟ اگر صحیح نیست چه روشی صحیح میباشد؟ اگر نباید از async استفاده شود چه روشی بهتر است؟
همانطور که از کد مشخص است برای هدف authorization نوشتم، ولی اگر بخواهم به صورت async در فیلتر استفاده کنم امکانپذیر نیست ، آیا راهی وجود دارد برای استفاده از async در فیلتر سفارشی توی mvc5 ؟
202 | 221 |
179 | 226 |
198 | 208 |
197 | 219 |
188 | 245 |
195 | 207 |
193 | 217 |
187 | 220 |
171 | 212 |
227 | 215 |
177 | 312 |
187 | 222 |
191.75 | 227 |
| |