Il problema principale e che hai saturato il pool di connessioni, come diceva ybla82 Sql Server non è in grado di restituirtene altre in quanto tutte sono occupate.
Per ovviare al problema puoi seguire diverse strade:
1. aumentare il Pool di connessioni disponibili se hai necessita di effettuare molte operazioni in parallelo (ne dubito... difficilmente si ricorre all'esecuzione Asincrona dei Tasks)
2. Evitare di eseguire query in questo modo:
codice:
Apro - Query 1 - Chiudo Apro - Query 2 - Chiudo
sarebbe più logico e sensato eseguire operazioni in questo modo:
codice:
Apro
Query - 1
Query - 2
Chiudo
Penso sia chiaro il beneficio che il Server SQL trae da questo tuo modo di eseguire le query. Soprattutto in applicazioni web, a differenza delle client, questo concetto è importantissimo.
Fai conto che quell "Apro/Chiudo/Apro/Chiudo" và moltiplicato per il numero di utenti connessi e quindi il numero delle connessione nel pool aumenta VERTIGINOSAMENTE in pochissimo tempo,
se tu fai Apri/Chiudi 3 volte in una pagina ed a questa pagina si connettono 5 persone a distanza di pochi secondi l'una dall'altra il calcolo è semplice:
Pool Size = 3(Apri/Chiudi) * 5 = 15
Cioè, hai inserito nel pool 15 Connessioni che restano li aperte per un determinato periodo di tempo in modo tale da poter essere successivamente servite velocemente (? questo non accade se non le gestisco bene!)