Nachdem ich das Konzept der asynchronen Web-Entwicklung, speziell von this Quelle erforscht, habe ich eine Beispielanwendung erstellt, um das Konzept zu beweisen.ASP.NET C# 5 asynchrone Web-Anwendungen mit Async & warten
Die Lösung besteht aus 2 ASP.NET Web API-Anwendungen. Der erste ist ein simulierter langsamer Endpunkt; es wartet auf 1000 ms, bevor eine Liste eine benutzerdefinierte Klasse namens Studenten Rückkehr:
public IEnumerable<Student> Get()
{
Thread.Sleep(1000);
return new List<Student> { new Student { Name = @"Paul" }, new Student { Name = @"Steve" }, new Student { Name = @"Dave" }, new Student { Name = @"Sue" } };
}
Hier ist der Student-Klasse:
public class Student
{
public string Name { get; set; }
}
Dieser Endpunkt in IIS 7 auf localhost gehostet wird: 4002.
der zweite Anwendung in Kontakt mit der ersten unter Verwendung von 2-Endpunkten, eine synchronen, asynchronen die anderen:
public IEnumerable<Student> Get() {
var proxy = WebRequest.Create(@"http://localhost:4002/api/values");
var response = proxy.GetResponse();
var reader = new StreamReader(response.GetResponseStream());
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
public async Task<IEnumerable<Student>> Get(int id) {
var proxy = new HttpClient();
var getStudents = proxy.GetStreamAsync(@"http://localhost:4002/api/values");
var stream = await getStudents;
var reader = new StreamReader(stream);
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
es in IIS 7 auf localhost gehostet: 4001.
Beide Endpunkte funktionieren wie erwartet und kehren in ca. 1 Sekunde. Basierend auf dem Video im obigen Link um 13:25 Uhr sollte die asynchrone Methode ihren Thread freigeben, wodurch Konflikte minimiert werden.
Ich führe Leistungstests für die Anwendung mit Apache Bench durch. Hier sind die Antwortzeiten für die synchrone Methode mit 10 gleichzeitigen Anfragen:
So viel ist, wie ich erwarten würde; Mehr gleichzeitige Verbindungen erhöhen die Konkurrenz und verlängern die Antwortzeiten. Allerdings sind hier die asynchronen Antwortzeiten:
Wie Sie sehen können, scheint es noch einige Anstoßes. Ich hätte erwartet, dass die durchschnittlichen Antwortzeiten ausgewogener wären. Wenn ich die Tests an beiden Endpunkten mit 50 gleichzeitigen Anfragen durchführe, bekomme ich immer noch ähnliche Ergebnisse.
Basierend darauf scheint es, dass sowohl asynchrone als auch synchrone Methoden mit mehr oder weniger der gleichen Geschwindigkeit (erwartet) laufen, ohne den Overhead in asynchronen Methoden zu berücksichtigen, aber auch, dass die asynchrone Methode nicht scheint Teile Threads zurück zum ThreadPool. Ich würde alle Kommentare oder Klarstellungen begrüßen, danke.
Die größte Änderung, die Sie erhalten, ist, wenn Ihre Methoden auf externe Quellen angewiesen sind, z. B. Datenbank. – JustAnotherUserYouMayKnow
Danke, ich hätte gedacht, dass dies der Fall für eine lang andauernde Anfrage war, was ich simuliert habe. Schlagen Sie vor, dass das async-Framework für IO-basierte Anforderungen optimiert ist, im Gegensatz zu CPU-gebundenen? Ich werde den Code so ändern, dass er eine Datenbankanforderung enthält. –
Der Sinn des async-Frameworks ist es, den Thread freizugeben, wenn er auf eine Antwort warten muss, damit er sich währenddessen anderen Aufgaben widmen kann. Dies ist die meiste Zeit für IO-basierte Anfragen der Fall. Wenn Sie viele Daten von der Datenbank anfordern, was sollte der Thread in der Zwischenzeit tun? Warte einfach, bis die Daten wieder da sind ... Oder gehe zurück zum threadpool und arbeite an anderen Sachen, bis die Daten zurück sind? – JustAnotherUserYouMayKnow