Jeg er uenig med Ricka i dette. Async DB-kommandoer er ikke kun gode, de er afgørende for at opnå skalering, gennemløb og reaktionstid. Hans indvending om opgraderingstiden for trådpuljen gælder kun for en webserver, der oplever lave trafikmængder.
I en situation med høj trafik (hvilket er den eneste, der betyder noget), behøver trådpuljen ikke at vente på at 'injicere' nye tråde. At udføre SQL-kommandoerne asynkront er vigtigt ikke kun ud fra et synspunkt om webserveranmodninger/trådes sundhed, men også ud fra et synspunkt om den samlede anmodnings levetid/latency:ukorrelerede DB-kald kan udføres parallelt i modsætning til sekventielt. Dette alene resulterer normalt i dramatiske forbedringer i HTTP-anmodningens latens, som brugeren oplever. Med andre ord indlæses dine sider hurtigere.
Et råd dog:SQL Command er ikke virkelig asynkron, før du aktiverer Asynchronous Processing=true
på forbindelsesstrengen. Selvom dette ikke er indstillet (og som standard ikke er det, Rediger:starter med .NET Framework <4.5. Asynchronous Processing
er ikke længere påkrævet
) dine 'asyncronous' opkald til BeginExecuteReader
er intet andet end et humbug, vil opkaldet starte en tråd og blokere det tråd. Når ægte async-behandling er aktiveret i forbindelsesstrengen så er opkaldet virkelig asynkront, og tilbagekaldet er baseret på IO-afslutning.
En advarsel:en asynkron SQL-kommando fuldføres, så snart den første resultatet returnerer til klienten, og infomeddelelser tæller som resultat.
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
Du har mistet alle fordelene ved async. print
opretter et resultat, der sendes tilbage til klienten, som fuldfører async-kommandoen og udførelsen på klienten genoptages og fortsætter med 'reader.Read()'. Nu det vil blokere, indtil den komplekse forespørgsel begynder at producere resultater. Du spørger 'hvem sætter print
i proceduren?' men print
kan være forklædt i noget andet, måske noget så uskyldigt udseende som en INSERT
der udføres uden udsender først en SET NOCOUNT ON
.