Wie Sie warten, für das Ergebnis der asynchronen web-service-Aufruf in ASP.NET für die beste Leistung
In WebForms ASP.NET Website (IIS, single app pool), ich Ruf zu langen web-service-Methode verwiesen, die in Visual Studio als Service-Referenz (.NET 4.0). Leider muss ich warten, bis Informationen aus dem web-Dienst vor, kann ich dienen-Seite an Benutzer. Derzeit web-service aufgerufen wird synchron so server können nicht wiederverwenden aktuellen thread zur Bearbeitung anderer Anträge, die hat Auswirkungen auf die Leistung.
Natürlich kann ich generieren asynchrone Operationen für die service reference in Visual Studio und rufen Sie BeginGetFoo
statt GetFoo
, aber noch muss ich warten, irgendwie zum Ergebnis aus dem web service.
Hier kommt Frage. Wenn ich AsyncWaitHandle.WaitOne
(wie unten) wird es sein, besser in der gesamten application-performance-Begriffe aus der synchronen Aufruf benutze ich heute?
IAsyncResult result = fooSoapClient.BeginGetFoo();
result.AsyncWaitHandle.WaitOne();
var foo = fooSoapClient.EndGetFoo(result);
Und natürlich, wenn Sie warten besser machen kann bin ich offen für Vorschläge.
- Möchten Sie vielleicht Lesen Sie die folgende Dokumentation: msdn.microsoft.com/en-us/library/2e08f6yc(v=vs. 100).aspx als Antwort auf Ihre questin dass die subjektive. Sie haben nicht genug Informationen
- Für die beste Leistung, nicht warten, sondern Fortsetzungen. Der code, den Sie geschrieben hat so ziemlich das gleiche wie ein synchroner Aufruf.
- Ich habe es gelesen. Welche Informationen benötigen Sie, ich werde froh sein, um es hinzuzufügen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie verwenden möchten eine Asynchrone Seite. Siehe "Wicked Code: Skalierbare Anwendungen mit Asynchronen Programmierung in ASP.NET", auch Asynchrone Seiten in ASP.NET 2.0, die Gespräche über web-services und Asynchrone Tasks mit RegisterAsyncTask.
AddOnPreRenderCompleteAsync()
ohne schwere refactoring, da web-service-Aufruf sitzt tief im business-Logik-Klasse, die in vielen Seiten. UndEndEventHandler
ausgeführt werden können, im anderen thread, das ist ein anderes refactoring Herausforderung.AddOnPreRenderCompleteAsync
aufrufen von web-service 3 mal auf einmal und zurück, wenn diese 3-Aufrufe abgeschlossen sind?AddOnPreRenderCompleteAsync
ich Brauch nur ein. Ich kann die Kette IAsyncResults aber ich will nicht auf die Kette, ich möchte zunächst alle 3 Anrufe auf einmal.ExecuteRegisteredAsyncTasks
Anruf wird ausgeführt, im gleichen thread als code ein, bevor Sie diese anrufen. So verstehe ich, dass manuell nannteExecuteRegisteredAsyncTasks
nicht frei die Anfrage-Verarbeitung-thread, um andere Anforderungen, und diese Methode sollte nur dann automatisch aufgerufen, um die Skalierung profitieren?Würden Sie immer noch in Beschlag thread. Eine "sichere" Möglichkeit wäre die Verwendung von ASP.NET MVC ist async-Controller: http://www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx
Ideal obwohl, sollten Sie nicht lange laufen die Dinge auf eine web-Anfrage. Habe einen windows-Dienst oder so etwas-Prozess die lang laufende task (das könnte durchstarten durch eine web-Anfrage fallen etwas auf eine message queue oder setzen Sie eine Aufgabe in einer Datenbank) und poll vom client unter Verwendung von ajax oder etwas, und aktualisieren Sie dann den Benutzer, wenn es fertig ist.
Wenn das refactoring von code ist nicht akzeptabel, so dass Sie nicht Folgen Sie @John Saunders Antwort, dann ist die einzige Sache, die Sie tun können, ist erhöhen Sie die Anzahl der threads für die Anwendung. Dies wird Ihnen ermöglichen, zu skalieren besser, aber irgendwann wird es den Regeln nachlassender Wirkungskraft und Sie werden beginnen, verletzen die Leistung. Was ist mehr, wenn Sie nicht haben, können Sie Benutzer warten auf die request queue (D. H. mehr als 25 gleichzeitige Benutzer pro Kern auf Ihrem server) Sie brauchen nicht, etwas zu tun. Für die asynchrone Programmierung in der web-server hilft nur mit der Skalierbarkeit, aber nicht die tatsächliche Leistung für einen einzelnen Benutzer.