C# 如何调用一些并行化的方法并从这些方法中获取信息?
我正在开发一个API,在这个API中我有一个带有方法的服务,这个方法必须在不同的存储库中调用三个方法。每个方法都有一个Https请求,调用有一个响应,我想从这个响应中获取信息 现在,我们正在等待每一个呼叫,性能非常糟糕 我怎么能同时打这三个电话呢?我知道使用并行,但我不知道如何使用 服务:C# 如何调用一些并行化的方法并从这些方法中获取信息?,c#,.net-core,parallel-processing,async-await,C#,.net Core,Parallel Processing,Async Await,我正在开发一个API,在这个API中我有一个带有方法的服务,这个方法必须在不同的存储库中调用三个方法。每个方法都有一个Https请求,调用有一个响应,我想从这个响应中获取信息 现在,我们正在等待每一个呼叫,性能非常糟糕 我怎么能同时打这三个电话呢?我知道使用并行,但我不知道如何使用 服务: public async Task<object> GetTenantSettings(string source, string tenantId) { var
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;
}
公共异步任务GetTenantSettings(字符串源,字符串tenantId)
{
var tenantsetings=wait _repository1.GetTenant(tenantId);
var accountCount=Wait_repository2.GetAccount(tenantId);
var userCount=await_repository3.GetUsers(source,int.Parse(tenantId));
var tenantsetingsmodel=maptanent(accountCount,userCount,tenantsetings);//要映射,超出问题的范围
返回租户设置模型;
}
存储库的界面,我展示了一个,但都有相同的想法
Task<int> GetAccount(string tenantId);
Task GetAccount(字符串tenantId);
现在我们正在调用一个方法,在调用其他方法之后,如何同时调用它并获取信息?我想您想要的是一个无阻塞的异步结果,而不是实际的并行结果,在这种情况下,它就像添加一个
任务一样简单
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使用率
记住,“更快”并不像听起来那么简单。如果这是一个多线程环境(例如web应用程序),那么您可能会以抢彼得换保罗(特别是在生成新线程时)。实际确认某个任务是否“更快”的唯一方法是在负载下对其进行基准测试。您想要并行还是异步(不同的事情)?与其逐个等待,不如使用获取变量中的所有任务并使用静态方法Task。Whalll(params Task[]tasks)并行执行所有任务。