Possiedo un'applicazione Web ASP.NET MVC che rende le chiamate di servizio Web in stile REST ad altri server. Ho uno scenario in cui sto facendo due chiamate HttpWebRequest a due servizi separati. Ho bisogno che entrambi si completino per continuare, ma il loro ordine non ha importanza. Potrebbero impiegare 1-2 secondi ciascuno e li sto eseguendo in sequenza ora. Eseguirle in parallelo ridurrebbe il tempo di risposta dell'utente, ma qual è il modo migliore?Consigli per l'esecuzione di .NET HttpWebRequests in parallelo in ASP.NET
Nella ricerca di questo, mi viene in mente diverse opzioni:
- Eseguire una richiesta sul thread principale, e girare un secondo thread per l'altra richiesta. Dovrebbero essere creati nuovi thread o usare un pool di thread? Se utilizzo una piscina, come posso ridimensionarla? Inoltre, non sono sicuro di come posso unire i fili di nuovo insieme (ad esempio, utilizzare ThreadPool.RegisterWaitForSingleObject)?
- Prova e utilizza il supporto integrato IAsyncResult per una o entrambe le richieste. Di nuovo, non sono sicuro su quali thread esegue la richiesta asincrona, quindi non si è sicuri di come dimensionare il pool di thread. Come posso unirmi a IAsyncResult nel mio thread principale? Tutti gli esempi trovo le informazioni sul processo nella richiamata, ma posso solo aspettare nella mia thread principale e utilizzare la proprietà IsCompleted?
Ho bisogno di trovare una soluzione che funzionerà ed eseguirà su scala. Questo è il motivo per cui sono preoccupato per il dimensionamento del pool di thread. Mi dispiacerebbe avere il blocco delle richieste perché sono in attesa di thread disponibili.
Hmmm, penso che lo spin-wait che si ha nello pseudo-codice (while (true)) sia adatto solo per tempi di attesa molto brevi. Penso che tu voglia usare una sorta di semaforo invece. – Mike
Ha detto che questa era l'app ASP.NET MVC, quindi supponevo che i tempi di attesa sarebbero generalmente piuttosto brevi. Quando dici semaforo non sono sicuro di quale contesto ti riferisci a come un semaforo funzionerebbe esattamente come uno spin-lock (senza il tempo CPU che può essere risolto nel codice rapido sopra) e richiede ancora un ciclo simile a quello sopra per rilasciare il blocco dato che abbiamo a che fare con più thread. – GrayWizardx