C# 将一个异步方法的输出链接为另一个异步方法c的输入

C# 将一个异步方法的输出链接为另一个异步方法c的输入,c#,async-await,call,chain,C#,Async Await,Call,Chain,我有下面的代码部分,其中SavePersonAsync方法调用了3个外部方法,有人能告诉我异步/等待方法的实现是正确实现的吗。是否有任何异步/等待未正确实现的调用链 public PersonService(IPersonDbService personDbService, IPersonEntityToPersonModelMapper personEntityToPersonModelMapper, IPersonModelToPersonEntity

我有下面的代码部分,其中SavePersonAsync方法调用了3个外部方法,有人能告诉我异步/等待方法的实现是正确实现的吗。是否有任何异步/等待未正确实现的调用链

    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               
        }));
    }
}

根据async await的定义,当您编写Wait时,流将按顺序启动,因为您需要在下一个语句中使用输出,因此在您的情况下,async await没有太多的用途

讲述它是如何工作的 假设您必须调用可以异步工作的方法,您的代码如下:

Var a=GetMethodA

Var b=GetMethodB

等待时机

等待b


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

为什么方法MapPersonModelToPersonEntityAsync和MapPersonEntityToPersonModelyAsync需要异步它们所做的是执行Linq查询?这些方法被程序的其他部分使用,并且需要异步功能。@开始时您的意思是接口具有不同的异步功能在其他地方实现,您必须遵循异步签名?@cassandrad没错,这两个接口的现有实现是异步IPersonModelToPersonTityMapper和IPersonTityToPersonModelApper。我不想更改它,因为它已经被大型应用程序的其他部分使用。让我知道是否有任何实施陷阱?如果是这样的话,如何避免或改进它。@TheBeginer,我没有看到任何,除了缺少ConfigureWaitFalse,因为我不知道如何使用这个类。