Quando si effettua la pianificazione delle attività, il compito di pianificazione consiste nel simulare l'avvio di una richiesta HTTP e scoprire che quando ci sono più attività, la pianificazione sembra essere come una falsa morte.
Il numero massimo predefinito di connessioni richieste su un sistema Windows normale è 2, mentre su un sistema operativo server il numero predefinito è 10. Se non modifichi questo limite di connessione concorrente,Poi il numero di connessioni http che il client può fare contemporaneamente è solo 2 o 10。
System.Net.ServicePointManager.DefaultConnectionLimit Questo è il numero massimo di connessioni che possono ottenere l'impostazione predefinita corrente, come mostrato nella figura sottostante:
Esiste un limite predefinito di concorrenza per HttpClient?
Prima di .Net 4.0, le operazioni Http erano affidabili a HttpWebRequest. Ha un massimo molto conservativo di 2 limiti di concorrenza per lo stesso sito di default, il che spesso fa sì che le HttpWebRequest non raggiungano la velocità ideale di default (immagino che questa strategia frustri molti programmatori), e il valore di App.config o ServicePointManager.DefaultConnectionLimit deve essere modificato.
Microsoft ha introdotto una classe HttpClient in .Net 4.5 per gestire le operazioni Http, e pensavo che HttpClient e HttpWebRequest seguissero la stessa politica. Oggi, scrivendo un programma di download multithread, ho usato 10 connessioni concorrenti e ho scoperto che HttpClient non ha di default un limite di numero concorrente.
All'inizio pensavo di sì. Net 4.5 ha rimosso questo limite di concorrenza (dopotutto, praticamente nessuno segue questo standard ormai), poi ha riscritto il codice rilevante con WebRequest, scoprendo che era ancora un limite di concorrenza di 2, e il valore di ServicePointManager.DefaultConnectionLimit era anch'esso 2. Cioè, HttpClient non è controllato dalla politica di concorrenza HttpWebRequest e non esiste un limite di concorrenza a livello di sistema.
Inoltre, durante i test, ho scoperto che HttpWebRequest non si comporta di default a un massimo di 2 concorrenti per tutti gli indirizzi. Per esempioNon esiste un limite di concorrenza per le connessioni locali con indirizzi HTTP (http://localhost/*).。
Chiamate multithread C# al limite di connessione concorrente HttpWebRequest
L'HttpWebRequest o WebClient di .net ha un limite di connessione concorrente nel caso del multithreading, che è 2 di default sui sistemi desktop come Windows XP e Windows 7, e 10 di default sui sistemi operativi server. Se non modifichi questo limite di connessione concorrente, il numero di connessioni HTTP che un client può effettuare contemporaneamente è solo 2 o 10. Per alcune applicazioni, come browser o spider, il numero di concorrenza di 2 o 10 è troppo basso e influisce molto sulle prestazioni dell'applicazione. Questo limite di connessione concorrente è dovuto agli standard HTTP 1.0 e HTTP 1.1 che specificano un massimo di 2 connessioni concorrenti. Tuttavia, i browser tradizionali non seguono più questa regola, ma il framework .NET la segue ancora di default.
Molti articoli dicono che accedere a HttpWebRequest in modo asincrono può migliorare le prestazioni concorrenti, ma ho testato che se non si cambia il numero predefinito di connessioni concorrenti, le prestazioni di accesso sincrone o asincrone non sono buone.
Possiamo anche impostare il numero massimo di connessioni concorrenti in app.config come segue:
Articolo di riferimento
Il login del link ipertestuale è visibile.
Il login del link ipertestuale è visibile.
|