2017-12-30 28 views
2

Warum verwendet HttpClient.GetAsync()/PostAsync()/SendAsync() usw. nur zwei Anfragen gleichzeitig?HttpClient.GetAsync führt nur 2 Anfragen gleichzeitig aus?

I getestet dies auf folgende Weise:

I einen async GET-Methode haben, die 10 Sekunden lang wartet, bevor es reagiert, ohne zu blockieren.

public async Task<string> Get() 
{ 
    var guid = Guid.NewGuid(); 
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: start"); 
    await Task.Delay(10000); 
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: end"); 
    return "hello"; 
} 

Wenn ich den Endpunkt von Chrome aufrufen, indem Sie mehrmals Auffrischen Ich sehe sie alle ausführen, sobald ich refresh getroffen, und ich erhalte die Antworten 10 Sekunden später:

39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:44 PM: start 
8326d829-28a6-48a2-9874-6506b79488af: 5:32:44 PM: start 
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:44 PM: start 
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:44 PM: start 
39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:54 PM: end 
8326d829-28a6-48a2-9874-6506b79488af: 5:32:54 PM: end 
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:54 PM: end 
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:54 PM: end 

Aber wenn ich machen Verwendung nennt diesen Code in einer Konsolenanwendung:

var client = new HttpClient(); 
for (var ii = 0; ii < 10; ii++) 
{ 
    client.GetAsync("http://localhost:50621/api/default"); 
} 
Console.ReadKey(); 

ich sehe, dass Console.ReadKey(); sofort erreicht, sind aber die Anforderungen je zwei ausgeführt - es macht 2-Anfragen , dann wartet 10 Sekunden, um zu beenden, dann weitere 2, weitere 10 Sekunden usw., obwohl alle 10 angeblich geplant worden sind.

80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:10 PM: start 
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:10 PM: start 
80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:20 PM: end 
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:20 PM: end 
a146c3ca-a0d2-4588-b60b-156f1febc944: 5:39:20 PM: start 
b71bc77f-9bdb-4aa6-936e-c702eb7d49eb: 5:39:20 PM: start 
.... 

Warum sind nicht alle Anfragen sofort gemacht? Hat HttpClient eine Art Limit für ausstehende Anfragen?

Antwort

4

HttpClient sowie andere Klassen http bezogen verwenden Servicestellen für http Verbindungsmanagement:

Die Servicepoint-Klasse verarbeitet Verbindungen zu einer Internet-Ressource basierend auf den Informationen Host in der Ressource Uniform weitergegeben Ressourcen-ID (URI). Die anfängliche Verbindung mit der Ressource bestimmt die Informationen, die das ServicePoint-Objekt verwaltet, , die dann von allen nachfolgenden Anforderungen an diese Ressource gemeinsam genutzt werden.

Es gibt ServicePointManager.DefaultConnectionLimit statische Eigenschaft, die für ServicePoint Objekt erlaubt standardmäßige maximale Anzahl gleichzeitiger Verbindungen steuert, und standardmäßig hat diese Eigenschaft Wert 2.

Das bedeutet, dass Sie standardmäßig nur 2 gleichzeitige Verbindungen haben zu gegebenem Gastgeber. Um dies zu "reparieren" - erhöhen Sie diese Zahl auf einen größeren Wert, normalerweise beim Start Ihrer Anwendung.

Verwandte Themen