Opgave: Async/Await/Task - Refactor the App so it's thread-safe and ready for multi-users

Kilde: Adding Asynchronous Processing to ASP.NET Core 3.1 Razor Pages

I denne opgave tager vi udgangspunkt i eksemplet ItemsRazor ItemRazorV12.zip





Opgaven går ud på at refaktorerer applikationen, så den er tråd-sikker (Thread-safe) og forberede applikationen til at kunne afvikles effektivt som flerbruger-applikation (dvs at den kan afvikle flere requests fra forskellige browsere/klienter samtidigt).
Hvis der fx benyttes async Task<IActionResult> OnGetAsync istedet for IActionResult OnGet() kan Razor Pages middelware håndtere de enkelte kald asynkront og evt benytte Thread-Pool til at håndtere kaldene mere effektiv.
Applikationen er delvis forberedt, men OnGet( )/OnPost( ) er ikke erklæret async og flere andre relevante metoder der heller ikke erklæret async. Desuden er det ikke alle kald der includere DB-kald der bliver await'et.

Dvs. mere konkret skal hele koden gennemgås og hvor der inkluderes kald til databasen, skal der sikres at hele "kæden" af metodekald afvikles async og at der benyttes await til at afvente færdiggørelse af DB-kald.

Strategi:
Gennemgå PageModel for PageModel - undersøg om OnGet( ) / OnPost( ) resultere i kald til Databasen. Hvis metoden resultere i et kald til Databasen så gøres selve metoden async og der indsættes await før kald af det kode der medfører DB-kald.
Typisk er det ikke OnGet/OnPost selv der laver kaldet til DB idet selve DB-kaldet ligger i en DbService, men det er vigtigt at alle led i kæden (alle kald fra OnGet/OnPost helt til selve DB-kaldet) gøres async.


Step 1 (Account/AccessDenied.cshtml.cs)
OnGet( ) metoden er tom og resultere ikke i et kald til databasen. Så ingen ændring her - tjek ok!


Step 2 (Admin/CreateUser.cshtml.cs)
OnPost( ) kalder AddUser(...) fra UserService der igen kalder AddObjectAsync(...)UserDbService (DbGenericService<User>) der har kaldet SaveChangesAsync()DataContext - dvs det medfører et DB-kald!!!

AddObjectAsync( )
Det bemærkes at:

AddUser( )
Det bemærkes at:

OnPost( )
Det bemærkes at:


Step 3 (Item/CreateItem.cshtml.cs)

OnGet( ) metoden indeholder ikke kald der resultere i kald til Databasen - så ingen ændringer her - tjek ok!
OnPost( ) kalder AddItem(..)ItemService der igen kalder GetObjectsAsync( )DbGenericService<Item> der henter DBSet<Item> fra DataContext - dvs det medfører et DB-kald!!!

GetObjectAsync( )
Det bemærkes at:

AddItem( )
Det bemærkes at:

OnPost( )
Det bemærkes at:



Step 4 (Resten)

Gennemgå trinvist og systematisk resten af applikationen og refaktorer på samme vis som i de forige step!


Step 5 (Afprøv)

Afprøv at programmet fortsat virker efter refaktorering.

 

 


God fornøjelse!
Henrik Høltzer