Для приложения, в котором я хочу выполнить асинхронное выполнение кода, имеет ли значение, что у меня есть несколько уровней асинхронных / ожидающих методов?
Давайте возьмем, например, веб-приложение (использующее asp. net core).
У нас есть контроллер, который делает что-то простое:
public class MyController : Controller
{
private readonly MyDbContext _context;
public MyController(MyDbContext context)
{
_context = context
}
public async Task<ActionResult> GetResource()
{
var resources = await _dbContext.Resources.ToList();
return Ok(resources);
}
}
Если я добавил отдельный уровень абстракции (скажем, например, я использую шаблон репозитория) ):
public class MyController : Controller
{
private readonly MyRepository _repo;
public MyController(MyRepository repo)
{
_repo = repo
}
public async Task<ActionResult> GetResource()
{
var resources = await _repo.GetResources();
return Ok(resources);
}
}
public class MyRepository
{
private readonly MyDbContext _context;
public MyRepository(MyDbContext context)
{
_context = context;
}
public async Task<Resource> GetResources()
{
return await _context.Resources.ToList();
}
}
Примечание Я очень хорошо знаю, что могу сделать код ниже, но пытаюсь проиллюстрировать точку.
public Task<Resource> GetResources()
{
return _context.Resources.ToList();
}
Все хотя это может быть надуманным примером, потому что awaits
будет удален, когда он доберется до байт-кода.
Насколько я понимаю, время выполнения создаст поток, когда он достигнет await
, так что в первом примере он создаст один поток, а во втором - два потока.
Имея это в виду, лучше ли держать какие-либо асинхронные задачи как можно ближе к точке входа?