Jag håller inte med Ricka i detta. Async DB-kommandon är inte bara bra, de är avgörande för att uppnå skalning, genomströmning och latens. Hans invändning om upprampningstiden för trådpoolen gäller endast en webbserver som upplever låga trafikvolymer.
I en situation med hög trafik (vilket är den enda som spelar roll), behöver trådpoolen inte vänta på att "injicera" nya trådar. Att göra SQL-kommandon asynkront är viktigt inte bara ur synvinkeln av webbserverförfrågningar/trådars hälsa, utan också ur synvinkeln av total livslängd/fördröjning:okorrelerade DB-anrop kan göras parallellt, i motsats till sekventiellt. Bara detta resulterar vanligtvis i dramatiska förbättringar av latensen för HTTP-förfrågan som upplevs av användaren. Med andra ord, dina sidor laddas snabbare.
Ett råd dock:SQL Command är inte riktigt asynkront förrän du aktiverar Asynchronous Processing=true
på anslutningssträngen. Även om detta inte är inställt (och som standard inte är det, Redigera:börjar med .NET Framework <4.5. Asynchronous Processing
behövs inte längre
) dina "asynkrona" anrop till BeginExecuteReader
är inget annat än en bluff, kommer samtalet att starta en tråd och blockera det tråd. När sann asynkbehandling är aktiverad i anslutningssträngen då är samtalet verkligen asynkront och återuppringningen baseras på IO-komplettering.
Ett varningens ord:ett asynkront SQL-kommando slutförs så snart den första resultatet returneras till klienten och informationsmeddelanden räknas som resultat.
create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end
Du har förlorat alla fördelar med asynkronisering. print
skapar ett resultat som skickas tillbaka till klienten, vilket slutför asynkroniseringskommandot och exekveringen på klienten återupptas och fortsätter med 'reader.Read()'. Nu det kommer att blockera tills den komplexa frågan börjar ge resultat. Du frågar 'vem som sätter print
i proceduren?' men print
kan vara förklädd i något annat, kanske något så oskyldigt som en INSERT
som körs utan först utfärdar en SET NOCOUNT ON
.