Когда мы запускаем ту же функцию в настольном приложении (например, в приложении WPF), мы видим ощутимую разницу в производительности.Пользовательский интерфейс не заблокирован, данные выводятся на экран немедленно, когда они становятся доступными.
Это распространенное заблуждение.Метод, который вы опубликовали, немного медленнее , чем его синхронный эквивалент, но в приложении с пользовательским интерфейсом он более отзывчив , и поэтому выглядит более производительным.
В сценарии ASP.NET страница отображается только после завершения всех асинхронных запросов;вот почему вы не видите разницы.
Вы можете сделать его на самом деле более производительным, распараллеливая ваши запросы:
var m2009Task = QueryMoviesAsync(2009, imageCount, pageSize);
var m2010Task = QueryMoviesAsync(2010, imageCount, pageSize);
var m2011Task = QueryMoviesAsync(2011, imageCount, pageSize);
await Task.WhenAll(m2009Task, m2010Task, m2011Task);
var m2009 = await m2009Task;
var m2010 = await m2010Task;
var m2011 = await m2011Task;
Это улучшит производительность длякак для настольных компьютеров, так и для ASP.NET.
В исходном коде используется последовательная композиция (по одному await
за раз)В этом случае код выполняется асинхронно, но запрос не выполняется быстрее.Использование async
/ await
по-прежнему имеет преимущество: запрос не связывает поток ASP.NET, поэтому ваша служба может расширяться.В мире пользовательского интерфейса поток пользовательского интерфейса не связан, поэтому он более отзывчив.Но как для ASP.NET, так и для пользовательского интерфейса метод итого время до завершения GetMoviesM
метод не уменьшается, если сделать его async
.
Параллельная композиция (использование Task.WhenAll
или Task.WhenAny
) позволяет GetMoviesM
в целом работать быстрее, поскольку он выполняет запросы параллельно.Кроме того, вы получаете преимущества потоков, упомянутые выше.
В этом случае количество процессоров не имеет значения.Они вступают в игру только тогда, когда вы выполняете обработку в пуле потоков (например, Task.Run
), а не при выполнении операций ввода-вывода.(Это упрощение, но достаточно верно).