Wenn ich in einem WebClient mehrere Anfragen an einen Webserver asynchron rausschicke, wie weiß ich dann, welche der Anfragen zurückkommt? Die zuerst ausgesendete muss ja nicht die sein, die als erstes vom Server zurückkommt.
Bibliotheken für .NET, die asynchrone Funktionen anbieten, halten sich oft an das Pattern für asnychrone Aufrufe, das Microsoft vorschlägt und auch selbst umsetzt.
Wichtig hier: Du kannst beim Aufruf ein beliebiges Objekt mitgeben (Standard-Name: userState), das Du dann im Callback wieder mit übergeben bekommst und über das Du Aufruf und Antwort einander zuordnen kannst. Ein Beispiel, aufbauend auf Andys Vorschlag:
servicesoapClient.SendFeedbackCompleted += ((sender, e) => { if (e.Error != null) MessageBox.Show( "Could not send feedback. Please try again.", "Error", MessageBoxButton.OK); else MessageBox.Show("Thank you for your feedback no. " + e.UserState); });
Relativ simpler Ansatz: Du gibst eine eindeutige ID (GUID?) beim Request mit, die der Server beim Response einfach wieder mit zurückschickt. Auf die Art weißt Du, welcher Response zu welchem Request gehört.
Das stimmt, die zuerst ausgesendete muss auch nicht zuerst als Antwort zurückkommen. Vielleicht kannst du deine Frage etwas genauer auf eine Technologie formulieren?
In C# hast du die Möglichkeit, mit einem Ereignishandler auf Antworten zu reagieren:
servicesoapClient.SendFeedbackAsync(message); servicesoapClient.SendFeedbackCompleted += ((sender, e) => { if (e.Error != null) MessageBox.Show( "Could not send feedback. Please try again.", "Error", MessageBoxButton.OK); else MessageBox.Show("Thank you for your feedback!"); });
-1: der Completed-Handler sollte vor dem ersten Aufruf registriert werden - wer weiß denn schon, wer schneller ist? Vor allem aber: der Code liefert noch keine Antwort auf die Frage, wie zwei verschiedene Aufrufe im Completed-Handler zu unterscheiden sind.