以下代码从3种不同的资源中获取属于客户的投资清单。该流程始于控制器的调用,然后遵循下面描述的流程,在该流程中,所有方法都被声明为异步方法,并由await运算符调用。
我想知道将所有方法设为异步是否存在问题。是否有任何性能损失?是代码气味还是反模式?
我知道有些事情必须waited
,例如访问URL,从cahce获取数据等。但是我认为有些事情像填写列表或求和一些值不需要异步。下面遵循代码(为清晰起见,省略了某些部分):
控制器
{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种不同的资源中获取属于客户的投资清单。该流程从控制器的调用开始,并遵循下面描述的流程,其中所有方法都是...
您的代码对我来说还不错。您仅将async
和await
用于I/O
和Web访问操作,它非常适合async
and await
purposes: