嵌套的异步方法太多。有问题吗?

问题描述 投票:3回答:1

以下代码从3种不同的资源中获取属于客户的投资清单。该流程始于控制器的调用,然后遵循下面描述的流程,在该流程中,所有方法都被声明为异步方法,并由await运算符调用。

我想知道将所有方法设为异步是否存在问题。是否有任何性能损失?是代码气味还是反模式?

我知道有些事情必须waited

,例如访问URL,从cahce获取数据等。但是我认为有些事情像填写列表或求和一些值不需要异步。

enter image description here

下面遵循代码(为清晰起见,省略了某些部分):

控制器

    {HttpGet]
    public async Task<IActionResult> Get()
    {
        Client client = await _mediator.Send(new RecuperarInvestimentosQuery());
        return Ok(cliente);
    }

QueryHandler

    public async Task<Client> Handle(RecoverInvestimentsQuery request, CancellationToken cancellationToken)
    {
        Client client;
        List<Investiment> list = await _investimentBuilder.GetInvestiments();
        client = new Cliente(request.Id, list);
        return client;
    }

InvestmentBuilder

    public async Task<List<Investiment>> GetInvestiments()
    {
        ListInvestiments builder = new ListInvestiments();
        await builder.BuildLists(_builder);
        // here I get the List<Investiment> list already fulfilled to return to the controller
        return list;
    }

BuildLists

    public async Task BuildLists(IBuilder builder)
    {
        Task[] tasks = new Task[] {
            builder.GetFundsAsync(),   //****
            builder.ObterTesouro(),
            builder.ObterRendaFixa()
        };
        await Task.WhenAll(tasks);
    }

资金,债券和固定收益服务(***这三种方法都是相同的,只是名称不同,所以为了节省空间,我只用其中一种方法)

    public async Task GetFundsAsync()
    {
        var listOfFunds = await _FundsService.RecoverFundsAsync();
        // listOfFunds will get all items from all types of investments
    }

收回资金,债券和固定收益的方法也相等,我只用其中之一

    public async Task<List<Funds>> RecoverFundsAsync()
    {
        var returnCache = await _clientCache.GetValueAsync("fundsService");
        // if not in cache, so go get from url
        if (returnCache == null)
        {
            string url = _configuration.GetValue<string>("Urls:Funds");
            var response = await _clienteHttp.ObterDadosAsync(url);
            if (response != null)
            {
                string funds = JObject.Parse(response).SelectToken("funds").ToString();
                await _clienteCache.SetValueAsync("fundService", funds);
                return JsonConvert.DeserializeObject<List<Funds>>(fundos);
            }
            else
                return null;
        }
        return JsonConvert.DeserializeObject<List<Funds>>(returnCache);
    }

HTTP客户端

    public async Task<string> GetDataAsync(string Url)
    {
        using (HttpClient client = _clientFactory.CreateClient())
        {
            var response = await client.GetAsync(Url);
            if (response.IsSuccessStatusCode)
                return await response.Content.ReadAsStringAsync();
            else
                return null;
        }
    }

缓存客户端

    public async Task<string> GetValueAsync(string key)
    {
        IDatabase cache = Connection.GetDatabase();
        RedisValue value = await cache.StringGetAsync(key);
        if (value.HasValue)
            return value.ToString();
        else
            return null;
    }

有人可以考虑一下吗?

提前感谢。

以下代码从3种不同的资源中获取属于客户的投资清单。该流程从控制器的调用开始,并遵循下面描述的流程,其中所有方法都是...

c# asynchronous async-await
1个回答
1
投票

您的代码对我来说还不错。您仅将asyncawait用于I/O和Web访问操作,它非常适合async and await purposes:

© www.soinside.com 2019 - 2024. All rights reserved.