Послойное асинхронное / ожидание в. Net - PullRequest
1 голос
/ 20 января 2020

Для приложения, в котором я хочу выполнить асинхронное выполнение кода, имеет ли значение, что у меня есть несколько уровней асинхронных / ожидающих методов?

Давайте возьмем, например, веб-приложение (использующее 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, так что в первом примере он создаст один поток, а во втором - два потока.

Имея это в виду, лучше ли держать какие-либо асинхронные задачи как можно ближе к точке входа?

1 Ответ

2 голосов
/ 20 января 2020

имеет ли значение, что у меня есть несколько слоев асинхронных / ожидающих методов?

Нет. Это нормально для go async полностью .

Правильный способ думать об этом - то, что ваши операции ввода / вывода естественно асинхронны. Например, запросы к базе данных. Поэтому все, что их вызывает, также естественно асинхронно. Например, домен или логи c слой. Поэтому все, что их вызывает, также естественно асинхронно. Например, контроллер. Вы не начинаете с контроллера и «делаете его асинхронным»; вы начинаете с ввода-вывода и делаете его асинхронным. Методы контроллера, которые не выполняют ввод / вывод , не должны быть асинхронными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...