Как вызвать некоторые методы, распараллеленные и получить информацию из этих методов? - PullRequest
0 голосов
/ 19 июня 2019

Я разрабатываю 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 Ответ

3 голосов
/ 19 июня 2019

Я предполагаю, что вы хотите, чтобы не блокировал асинхронный результат, а не фактическую параллель, в этом случае это так же просто, как добавить 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(). Это возможно, но при условии, что ваши вызовы в хранилище связаны с вводом-выводом, а не с процессором , вы вряд ли получите большую выгоду, поскольку, поскольку этот подход должен максимально увеличить использование ввода-вывода без блокировки потока.

Помните, «Быстрее» не так просто, как кажется. Если это многопоточная среда (как, например, веб-приложение), то вы можете грабить Питера, чтобы платить Паулу (особенно при создании новых потоков). Единственный способ убедиться, что что-то «быстрее», - это сравнить его с нагрузкой.

...