UWP(フロントエンド)とREST-MVC-IIS(バックエンド)で開発されたプロジェクトに取り組んでいます。UWP + IIS +非同期動作
私は結果として起きる可能性が理論的なシナリオを考えていた:
私が知っているから、リクエストが処理され、IISによって提供される順序を保証する方法はありません。
だから、単純なシナリオでは、ちょうどこの仮定しよう:
UI:
SelectionChanged(商品コード= 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
、何らかの理由productId=2
の要求はproductId=1
の最初の要求、その後速く終えました。
非同期で動作するため、両方の呼び出しでUIに2つの継続タスクが作成され、同じデータが含まれているため正しい順序で表示されない場合は、互いにオーバーライドされます。
ほとんどのマスター/ディテールのシナリオでは、マスターアイテムを選択して間違った情報を取得することがあります(IISからの応答が返されるため)。
私が知りたいのは、この種のシナリオを処理するベストプラクティスがある場合です。解決策がたくさん気になりますが、私が試してみる前に、銃を飛ばして1つの実装に行きたくありません。表にある他のオプションを確認してください。
2つのUIを使用すると、表示さ呼び出します。彼らは文字通り他のコードに続いて2行のコードですか?その場合、2行目は最初の行が完了するまで実行されず、IISへの往復はすべて完了します。 – sellotape
さて、2つの連続した呼び出しで使用されている非同期が欠落していました。非同期は、順次処理されずに並行処理されるため、すべてが変更されます。最初の呼び出しが最初に処理されることを意味します。つまり、2番目の要求が最初に終了した場合(何らかの理由で)、最初に呼び出された呼び出しが最初に処理されるため、上記の状況では、後の呼び出しが以前の呼び出しの結果をオーバーライドします。 –
2つのUI行が連続していれば、並列では処理されません_。次の行に進む前に、呼び出しが終了するまで待ちます。実行は呼び出し元のメソッドではうまくいくかもしれませんが、待機しているタスクが完了するまで現在のメソッドでは処理を続行しません。 – sellotape