Pomocny może być mój artykuł MSDN na ten temat ; W tym artykule poświęciłem dużo miejsca opisując, kiedy powinieneś używać async
na ASP.NET, a nie tylko jak używać async
na ASP.NET.
Mam pewne obawy dotyczące używania akcji asynchronicznych w ASP.NET MVC. Kiedy poprawia to wydajność moich aplikacji, a kiedy - nie.
Po pierwsze, zrozum, że async
/ await
dotyczy uwolnienia wątków . W aplikacjach GUI chodzi przede wszystkim o zwolnienie wątku GUI, aby wygoda użytkownika była lepsza. W aplikacjach serwerowych (w tym ASP.NET MVC) chodzi głównie o zwolnienie wątku żądania, aby serwer mógł się skalować.
W szczególności nie będzie:
- Spraw, aby Twoje indywidualne zamówienia były kompletne szybciej. W rzeczywistości ukończą (tylko trochę młodości) wolniej.
- Wróć do dzwoniącego / przeglądarki, gdy trafisz
await
. await
„ustępuje” tylko puli wątków ASP.NET, a nie przeglądarce.
Pierwsze pytanie brzmi - czy dobrze jest używać akcji asynchronicznej wszędzie w ASP.NET MVC?
Powiedziałbym, że dobrze jest używać go wszędzie tam, gdzie robisz operacje wejścia / wyjścia. Jednak niekoniecznie może być korzystne (patrz poniżej).
Jednak źle jest używać go do metod związanych z procesorem. Czasami deweloperzy myślą, że mogą czerpać korzyści, async
po prostu dzwoniąc Task.Run
do kontrolerów, a to jest okropny pomysł. Ponieważ ten kod ostatecznie zwalnia wątek żądania przez zajęcie innego wątku, więc nie ma żadnej korzyści (i w rzeczywistości ponoszą karę za dodatkowe przełączanie wątków)!
Czy powinienem używać słów kluczowych asynchronicznie / oczekując na zapytanie do bazy danych (poprzez EF / NHibernate / inną ORM)?
Możesz użyć wszelkich dostępnych metod. Obecnie większość głównych graczy obsługuje async
, ale jest kilka, którzy tego nie robią. Jeśli twój ORM nie obsługuje async
, nie próbuj go owijać Task.Run
ani nic w tym stylu (patrz wyżej).
Zauważ, że powiedziałem „ty mógł użyć”. Jeśli mówisz o ASP.NET MVC z pojedynczym zapleczem bazy danych, to (prawie na pewno) nie odniesiesz żadnych korzyści ze skalowalności async
. Wynika to z faktu, że IIS może obsługiwać znacznie więcej współbieżnych żądań niż jedno wystąpienie serwera SQL (lub innego klasycznego RDBMS). Jednakże, jeśli backend jest bardziej nowoczesny - klaster SQL Server, SQL Azure, NoSQL, etc - a backend można skalować, a skalowalność gardłem jest IIS, a następnie można uzyskać korzyści ze skalowalności async
.
Trzecie pytanie - ile razy mogę używać słów kluczowych do asynchronicznego przeszukiwania bazy danych w JEDNEJ metodzie pojedynczego działania?
Tyle, ile chcesz. Należy jednak pamiętać, że wiele ORM ma regułę „jedna operacja na połączenie”. W szczególności EF pozwala tylko na jedną operację na DbContext; dotyczy to zarówno operacji synchronicznej, jak i asynchronicznej.
Pamiętaj również o skalowalności swojego backendu. Jeśli trafiasz w jedną instancję SQL Server, a Twój IIS jest już w stanie utrzymać pełną wydajność SQLServera, to podwojenie lub potrojenie nacisku na SQLServera wcale ci nie pomoże.