برای تشریح بهتر من نتیجه تست خود را اضافه میکنم. من از 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;
و نتیجه با جزئیات را در آخر اضافه کرده ام :
اما خلاصه میانگین روش 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 |