我們正在開發一個在UWP(前端)和REST-MVC-IIS(後端)中開發的項目。UWP + IIS +異步行爲
我想上可能引發了理論場景:
據我所知,有沒有辦法保證其請求將被處理和IIS服務的順序。
因此,在一個簡單的場景,讓我們姑且這樣的:
UI:
的SelectionChanged(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
正如你所看到的,對於productId=2
要求無論出於何種原因更快地完成然後productId=1
的第一個請求。
由於異步工作的方式,兩個通話將建立一個關於這將覆蓋對方,如果他們不按照正確的順序來,因爲它們含有相同的數據的UI兩種續任務。
這可以外推到幾乎任何master-detail場景,在這種情況下,最終可能會選擇主項目並獲取錯誤的細節(因爲響應從IIS返回的順序)。
我想知道的是,是否有一些最佳實踐來處理這種情況......很多解決方案都浮現在腦海中,但我不想在試圖實施之前跳過槍並執行一次實施看看桌上還有什麼其他選項。
兩個UI叫你展示;是他們字面上的兩行代碼一個跟着另一個?如果是這樣,第二行在第一行完成之前不會開始執行,並且整個往返IIS的操作都已完成。 – sellotape
那麼,你錯過了連續兩次調用中使用的異步,這會改變一切,因爲它們不會被順序處理,而是並行處理。這並不是說並行,但這兩個調用的結果稍後將在兩個調用的延續任務中處理,這意味着返回的第一個調用將被首先處理,因此如果第二個請求首先結束(無論出於何種原因)那麼最終會出現上述情況,其中稍後的調用將覆蓋先前調用的結果。 –
如果這2條UI線是連續的,它們將不會並行處理。等待意味着:等到通話結束後再繼續下一行。執行可能會繼續執行調用方法,但在當前方法中不會繼續執行,直到等待完成的任務完成。 – sellotape