我正在开发一个API,在这个API中,我有一个带有方法的服务,该方法必须调用不同存储库中的三个方法。每个方法都有一个Https请求,调用有一个响应,我想从该响应中获取信息。
现在,我们正在等待每个调用,而且性能太差了。
该如何同时拨打这三个电话?我知道使用并行,但我不知道如何。
服务:
public async Task<object> GetTenantSettings(string source, string tenantId)
{
var tenantSettings = await _repository1.GetTenant(tenantId);
var accountCount = await _repository2.GetAccount(tenantId);
var userCount = await _repository3.GetUsers(source, int.Parse(tenantId));
var TenantSettingsModel = MapTenant(accountCount, userCount, tenantSettings); // To map, out of scope of the problem
return TenantSettingsModel;
}
存储库的界面,我展示了一个,但是所有人都有相同的想法。
Task<int> GetAccount(string tenantId);
现在我们正在调用一个方法,而在另一个方法之后,我该如何同时调用它并获取信息?
答案 0 :(得分:3)
我假设您想要的是无阻塞异步结果,而不是实际的并行结果,在这种情况下,就像添加Task.WhenAll
一样简单:
var tenantSettings = _repository1.GetTenant(tenantId);
var accountCount = _repository2.GetAccount(tenantId);
var userCount = _repository3.GetUsers(source, int.Parse(tenantId));
await Task.WhenAll(tenantSettings, accountCount, userCount);
var TenantSettingsModel = MapTenant(accountCount.Result, userCount.Result, tenantSettings.Result);
实际的并行处理将需要使用Task.Run()
产生新线程。这是可能的,但是假设您对存储库的调用是IO bound, not CPU bound,那么您不太可能获得很多好处,因为这种方法应在不阻塞线程的情况下最大化IO使用率。
请记住,“更快”并不像听起来那样简单。如果这是一个多线程环境(例如Web应用程序),那么您可能会抢劫彼得支付报酬(特别是在生成新线程时)。实际确认某些事物是否“更快”的唯一方法是在负载下对其进行基准测试。