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ć asyncna ASP.NET, a nie tylko jak używać asyncna 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/ awaitdotyczy 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, asyncpo prostu dzwoniąc Task.Rundo 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.Runani 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.