如何调用一些并行化的方法并从该方法获取信息?

时间:2019-06-19 12:04:36

标签: c# .net-core parallel-processing async-await

我正在开发一个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);

现在我们正在调用一个方法,而在另一个方法之后,我该如何同时调用它并获取信息?

1 个答案:

答案 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应用程序),那么您可能会抢劫彼得支付报酬(特别是在生成新线程时)。实际确认某些事物是否“更快”的唯一方法是在负载下对其进行基准测试。