Есть много вызовов Asyn c, как сделать это быстрее? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть вызов API, внутри вызова API много вызовов asyn c. код выглядит следующим образом:

.....
var getFeaturedTask = await _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = await _listingProxy.GetRentalsAsync(request);
var getContactTask = await _contactProxy.GetLeadContactAsync(request);
var getSignTask = await _signProxy.GetListingSignsAsync(request);
var getTextTask = await _signProxy.GetTextCodeForListingAsync(request);
......

Есть более 20 задач. Мне интересно, есть ли способ заставить эту часть кода работать быстрее. Например, я должен использовать приведенный ниже код, и он будет быстрее?

var getFeaturedTask = _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = _listingProxy.GetRentalsAsync(request);
var getContactTask = _contactProxy.GetLeadContactAsync(request);
var getSignTask = _signProxy.GetListingSignsAsync(request);
......
Task.WaitAll(new Task[] { getFeaturedTask, getRentalTask, getContactTask, getSignTask, ... });

Есть ли другие возможности? Или, несмотря ни на что, время, которое мы можем сэкономить, очень мало, не стоит?

Спасибо

Ответы [ 2 ]

4 голосов
/ 07 апреля 2020

WhenAll является подходящим способом выполнения асинхронного параллелизма:

var getFeaturedTask = _listingProxy.GetFeaturedListingsAsync(request);
var getRentalTask = _listingProxy.GetRentalsAsync(request);
var getContactTask = _contactProxy.GetLeadContactAsync(request);
var getSignTask = _signProxy.GetListingSignsAsync(request);
......
await Task.WhenAll(getFeaturedTask, getRentalTask, getContactTask, getSignTask, ...);

Этот блок кода будет выполнять все асинхронные запросы одновременно. Если , то они действительно являются асинхронными операциями (т. Е. Не блокируются асинхронными сигнатурами), и , если они занимают достаточно много времени, чтобы (небольшие) дополнительные издержки WhenAll преодолено, и нет дополнительных систем регулирования на месте (т. е. если прокси-серверы разрешают только один запрос за раз на IP или что-то подобное), тогда этот блок должен работать быстрее.

2 голосов
/ 07 апреля 2020

Это во многом зависит от того, какие здесь «прокси». Некоторые вещи поддерживают параллельные операции; некоторые этого не делают (это означает, что произойдет сбой, если вы попытаетесь выполнить вторую асинхронную операцию c на том же объекте, когда первый еще не завершен, как вы делаете с _listingProxy и _signProxy). И даже если они это делают: иногда параллелизм повышает производительность (особенно когда два запроса независимы, в лучшем случае - маршрутизация на отдельные серверы), в некоторых случаях ios параллелизм не будет иметь никакого значения вообще, а в некоторых (редко-я *) 1017 *) сценарий ios параллелизм будет иметь вредное влияние на производительность.

Итак: нет реального способа узнать в общем случае , но вы могли бы конечно попробуй. Единственное, что я скажу наверняка, это то, что вы не должны использовать Task.WaitAll. Вы могли бы использовать await Task.WhenAll или await каждый по очереди (но это может привести к ненаблюдаемым исключениям в случае сбоя нескольких).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...