有一个Web应用程序没有任何自己的数据库,但通过API与远程通信。执行API调用需要一些时间,我们异步执行。从用户的角度来看,应用程序的响应性必须很高。
假设用户正在更改某些数据。要存储我们需要拨打电话的数据。我们在拨打电话后立即开始显示新数据。但是如果电话的响应不成功,我们该怎么办?我们需要恢复旧值并向用户显示某种警告。但是用户可能会离开页面,其中数据被更改并且看到完全不同的页面。处理此类情况的一般模式是什么?
答案 0 :(得分:0)
如果您使用的是.Net 4.5,则可以使用async/await
执行此操作。如果您正在调用的Web客户端提供了返回Task
的异步API,则只需await
try/catch
块内的await
调用。 await
将导致该方法立即返回,以便用户在执行时继续观察旧数据。一旦我们的客户呼叫完成,方法"恢复"在catch
之后,您可以更新数据。
如果Web客户端调用导致异常,该方法将在public async Task CallAPI()
{
try
{
var client = ...
await client.CallAPI();
}
catch(Exception ex)
{
// show warning message
}
}
块中恢复,您可以向用户显示错误。
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());
}
如果您的Web客户端没有提供异步API,您可以使用任务并行库实现等效。
async/await
This article了解有关{{1}}的更多信息。 this one有一些最佳实践可供使用。