PDA

View Full Version : زمان استفاده از Async در mvc core



sara_t
پنج شنبه 14 تیر 1397, 13:39 عصر
سلام

دوستان برای یک ریپازیتوری عمومی متدها رو بصورت Async بنویسم بهتر هست یا بصورت ساده ؟ و در کنترلر فراخوانی رو بصورت async انجام بدم ؟ ممنون


public async Task Add(TEntity entity)
{
await _dbContext.Set<TEntity>().AddAsync(entity);

}

یا


public void Add(TEntity entity)
{
_dbContext.Set<TEntity>().Add(entity);
}

ali_md110
پنج شنبه 14 تیر 1397, 14:16 عصر
این لینک ابتدا بخونید
http://barnamenevis.org/showthread.php?547762
و جهت تکمیل لینک بالا
هر زمان یک متدی دارید که درون اون فقط یک لیست و یا بهتر بگم فقط یک کوئری TolistAsync دارید نیاز به تعریف async در تعریف امضای متد نیستیم و همچنین await در بدنه کد نیست

مثلا اگر تابعی دارید بدینصورت


public async Task GetAllAsync()
{
var list=await dbcontext.person.ToListAsync();
var list2=await dbcontext.persondetails.ToListAsync();
foreach(var p in list)
var li=list2.first(x=> x.id=p.id);
}



چون در این تابع از جدول person واکشی کردیم وبلافاصله به نتیجه اون در همین متد نیاز داریم مجبوریم از async و await در این متد استفاده کنیم کامپایلر هم به ما هشدار میدهد
ولی اگر یک متد داریم که فقط یک tolist دارد و در سایر متدها ی دیگر قابل استفاده میکنیم جهت سربار کمتر امضای متد را بدون async تعریف و await را هم از بدنه کد حذف کنید
و هنگام صدا زدن کافیه قبل از متد await را بکار ببریم


Task List<Person>Get()
{
return dbcontext.persons.ToListAsync();
}








روش صدا زدن


async Task CallMetod()
{
var i=await Get()
}

sara_t
پنج شنبه 14 تیر 1397, 16:01 عصر
خیلی ممنونم

در واقع منظورتون اینه که نتیجه متد get رو بصورت Async برگردونیم مثل این مورد درسته؟



public async Task<IActionResult> Index()
{
var qMenu = await Task.FromResult(_repository.Get());
return View("Index", qMenu);
}

ali_md110
پنج شنبه 14 تیر 1397, 16:51 عصر
Task.FromResult زمانی استفاده میکنیم که بخواهیم نتیجه انی یک Task را بگیریم مثلا یک متد async که یک مقدار عددی بر میگرداند
بهتر ست برای متدهای لیستی بدین روش بکار ببریم




public async Task<IActionResult> Index()
{
var qMenu = await _repository.Get();
return View("Index", qMenu);
}

sara_t
پنج شنبه 14 تیر 1397, 18:07 عصر
public async Task<IActionResult> Index()
{
var qMenu = await _repository.Get();
return View("Index", qMenu);
}


ممنون . خب اگه من کد رو به این صورت بنویسم این ارور رو دارم :



'Group' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'Group' could be found (are you missing a using directive or an assembly reference?)



group هم که کلاسی هست که براش ریپازیتوری ساختم

ali_md110
جمعه 15 تیر 1397, 00:17 صبح
متد Get به درستی به صورت asyncپیاده سازی نشده
لطفا کدهاشو ارسال کنید

sara_t
شنبه 16 تیر 1397, 15:30 عصر
متد Get به درستی به صورت asyncپیاده سازی نشده


مرسی. پست قبلی شما رو اشتباه برداشت کرده بودم متد رو بدون async نوشته بودم . ممنون