C# 如何调用一些并行化的方法并从这些方法中获取信息?

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

我正在开发一个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;
    }
公共异步任务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)并行执行所有任务。