【问题标题】:Chaining output of an async method as input of another async method c#将异步方法的输出链接为另一个异步方法的输入c#
【发布时间】:2018-02-02 10:19:24
【问题描述】:

我有以下代码部分,其中 SavePersonAsync 方法正在调用 3 个外部方法,任何人都可以告诉我异步/等待方法的实现是否正确实现。是否有没有正确实现 async/await 的调用链?

    public PersonService(IPersonDbService personDbService,
        IPersonEntityToPersonModelMapper personEntityToPersonModelMapper,
        IPersonModelToPersonEntityMapper personModelToPersonEntityMapper)
    {
        _personDbService = personDbService;
        _personEntityToPersonModelMapper = personEntityToPersonModelMapper;
        _personModelToPersonEntityMapper = personModelToPersonEntityMapper;
    }


    public async Task<IEnumerable<PersonModel>> SavePersonAsync(IEnumerable<PersonModel> personsModel)
    {
        var personsEntity = await _personModelToPersonEntityMapper.MapPersonModelToPersonEntityAsync(personsModel);

       var savedPersons = await _personDbService.SavePersonAsync(personsEntity.First()); // Currently only alow one person at a time, later it will allow to save a collection of persons

        return await _personEntityToPersonModelMapper.MapPersonEntityToPersonModelyAsync(new List<PersonEntity>
        {
            savedPersons
        });
    }
}

public class PersonEntityToPersonModelMapper : IPersonEntityToPersonModelMapper
{
    public async Task<IEnumerable<PersonModel>> MapPersonEntityToPersonModelyAsync(
        IEnumerable<PersonEntity> personsEntity)
    {
        if (personsEntity.NullOrEmpty())
            return await Task.FromResult(Enumerable.Empty<PersonModel>());

        return await Task.FromResult(personsEntity.Select(personEntity => new PersonModel
        {
            FirstName = personEntity.FirstName,
            LastName = personEntity.LastName              
        }));
    }
}

public class PersonModelToPersonEntityMapper : IPersonModelToPersonEntityMapper
{
    public async Task<IEnumerable<PersonEntity>> MapPersonModelToPersonEntityAsync(IEnumerable<PersonModel> personsModel)
    {
        if (personsModel.NullOrEmpty())
            return await Task.FromResult(Enumerable.Empty<PersonEntity>());

        return await Task.FromResult(personsModel.Select(personModel => new PersonEntity
        {                
            FirstName = personModel.FirstName,
            LastName = personModel.LastName               
        }));
    }
}

【问题讨论】:

  • 为什么MapPersonModelToPersonEntityAsyncMapPersonEntityToPersonModelyAsync 方法必须是async 他们所做的只是执行一个Linq 查询?
  • 程序的其他部分正在使用这些方法,并且需要异步功能。
  • @TheBeginer 你的意思是接口在其他地方有不同的异步实现,你必须遵循异步签名?
  • @cassandrad 没错,这两个接口的现有实现是异步的(IPersonModelToPersonEntityMapper 和 IPersonEntityToPersonModelMapper)。而且我不想更改它,因为它已被大型应用程序的其他部分使用。让我知道是否有任何实施陷阱?如果是这样,如何避免或改善它。
  • @TheBeginer,除了缺少ConfigureAwait(false),我没有看到任何内容,因为我不知道这个课程将如何使用。

标签: c# async-await call chain


【解决方案1】:

根据 async await 的定义,当您编写 await 时,流程将按顺序开始,由于您需要在下一条语句中使用输出,因此在您的情况下没有太多使用 async await

简要介绍它的工作原理 假设您必须调用可以异步工作的方法调用,您的代码可以像这样:

Var a = GetMethodA();

Var b = GetMethodB();

等待;

等待b;

在这种情况下,您的方法将异步工作

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多