有一個Web應用程序沒有任何自己的數據庫,但通過API與遠程進行通信。執行對API的調用需要一些時間,我們會異步執行。從用戶的角度來看,應用程序的響應速度必須很高。選擇策略來處理來自異步API調用的響應
我們假設用戶正在改變一些數據。要存儲我們需要撥打電話的數據。我們在撥打電話後開始顯示新數據。但是如果通話的迴應不成功,我們該怎麼辦?我們需要恢復舊值並向用戶顯示某種警告。但用戶可能離開頁面,數據發生變化,並看到完全不同的頁面。處理這種情況的一般模式是什麼?
有一個Web應用程序沒有任何自己的數據庫,但通過API與遠程進行通信。執行對API的調用需要一些時間,我們會異步執行。從用戶的角度來看,應用程序的響應速度必須很高。選擇策略來處理來自異步API調用的響應
我們假設用戶正在改變一些數據。要存儲我們需要撥打電話的數據。我們在撥打電話後開始顯示新數據。但是如果通話的迴應不成功,我們該怎麼辦?我們需要恢復舊值並向用戶顯示某種警告。但用戶可能離開頁面,數據發生變化,並看到完全不同的頁面。處理這種情況的一般模式是什麼?
如果您使用.Net 4.5,您可以使用async/await
來完成此操作。如果您正在調用的Web客戶端提供的異步API返回Task
,那麼您可以在try/catch
塊中簡單地調用await
。 await
將導致該方法立即返回,以便用戶在執行時將繼續觀察舊數據。一旦我們的客戶電話完成await
後的「恢復」方法,您就可以更新您的數據。
如果Web客戶端調用導致異常,該方法將在catch
塊中繼續,並且可以向用戶顯示錯誤。
public async Task CallAPI()
{
try
{
var client = ...
await client.CallAPI();
}
catch(Exception ex)
{
// show warning message
}
}
如果您的網絡客戶端不提供異步API可以實現與任務並行庫的等價物。
public void CallAPI1()
{
Task.Factory.StartNew(() =>
{
var client = ...
client.CallAPI();
}).ContinueWith(t =>
{
if(t.Exception != null)
{
// display error
}
else
{
// update web page with
}
},
null,
CancellationToken.None, TaskScheduler.FromCurrentSynchronizationContext());
}
This article對async/await
更多信息。並且this one有一些最佳實踐要遵循。