Wir arbeiten an einem Projekt, das in UWP (Frontend) und REST-MVC-IIS (Backend) entwickelt wurde.UWP + IIS + asynchrones Verhalten
Ich war auf einem theoretischen Szenario denken, die sich daraus ergeben können:
Von dem, was ich weiß, gibt es keine Möglichkeit, die Reihenfolge, in der gewährleisten Anfragen werden von IIS verarbeitet und serviert werden.
So in einem einfachen Szenario, lassen Sie uns dies einfach mal davon aus:
UI:
Selection (productId = 1);
SelectionChanged (productId = 2);
private async void SelectionChanged(int productId)
{
await GetProductDataAsync(productId);
}
IIS:
GetProductDataAsync(productId=1) scheduled on thread pool
GetProductDataAsync(productId=2) scheduled on thread pool
GetProductDataAsync(productId=2) finishes first => send response to client
GetProductDataAsync(productId=1) finishes later => send response to client
Wie Sie sehen können, beendet der Antrag auf productId=2
aus irgendeinem Grund schneller als die erste Anfrage für productId=1
.
Da die Funktionsweise von async funktioniert, erstellen beide Aufrufe zwei Fortsetzungsaufgaben auf der Benutzeroberfläche, die sich gegenseitig überschreiben, wenn sie nicht in der richtigen Reihenfolge angezeigt werden, da sie die gleichen Daten enthalten.
Dies kann auf fast jedes Master-Detail-Szenario extrapoliert werden, wo es passieren kann am Ende ein Master-Element auswählen und die falschen Details dafür bekommen (wegen der Reihenfolge, in der die Antwort von IIS kommt). Ich wollte wissen, ob es einige Best Practices gibt, um diese Art von Szenarien zu meistern ... viele Lösungen kommen mir in den Sinn, aber ich möchte nicht auf die Idee kommen und eine Implementierung durchführen, bevor ich versuche Sehen Sie, welche anderen Optionen auf dem Tisch liegen.
Die beiden UI ruft Sie zeigen; Sind sie buchstäblich 2 Zeilen Code hintereinander? Wenn dies der Fall ist, beginnt die zweite Zeile erst mit der Ausführung, wenn die erste abgeschlossen ist, und der gesamte Umlauf nach IIS ist abgeschlossen. – sellotape
Nun, Sie haben den Async verpasst, der für die zwei aufeinander folgenden Aufrufe verwendet wird, der alles ändert, da sie nicht sequenziell, sondern parallel verarbeitet werden. Nun, nicht parallel je nach Aussage, aber das Ergebnis dieser beiden Aufrufe wird später in einer Fortsetzungsaufgabe für beide Aufrufe verarbeitet, was bedeutet, dass der erste Aufruf, der zurückkehrt, zuerst verarbeitet wird, wenn die zweite Anfrage zuerst beendet wird (aus welchem Grund auch immer) dann landen Sie in der oben beschriebenen Situation, wo der spätere Aufruf das Ergebnis des früheren Aufrufs überschreibt. –
Wenn diese 2 UI-Zeilen fortlaufend sind, werden sie nicht parallel verarbeitet. Das Warten bedeutet genau das: Warten Sie, bis der Anruf beendet ist, bevor Sie mit der nächsten Zeile fortfahren. Die Ausführung wird möglicherweise in der aufrufenden Methode fortgesetzt, wird jedoch in der aktuellen Methode erst fortgesetzt, wenn die erwartete Aufgabe abgeschlossen ist. – sellotape