我在一个Web api控制器中有一个现有的方法,它从一个内部API返回数据。此方法目前大约需要6秒才能完成
我需要调整此方法,以便向外部API发送最多4个请求,然后将结果保存到数据库。
每次调用外部API大约需要2-3秒才能完成。
虽然对外部API的调用很重要,但我不能延迟用户体验。因此,同步调用外部api不是一个选项,因为每次调用可能需要3秒*4= 12秒,然后必须调用内部api (5秒)= 17秒
为了解决这个问题,我做了以下更改:
使Web API方法异步创建异步调用外部api并返回任务的方法
-内部接口方法调用前,调用方法4次,将结果添加到列表中,使用Task.Delay()创建timeoutTask,持续5秒;
--调用内部API方法
循环遍历任务列表调用task.WhenAny( timeoutTask,timeoutTask)如果任务已完成但任务未完成,则它已超过超时,因此停止处理。
为了演示这个问题,我创建了一个新的Index MVC Web项目,并将等效代码添加到HomeController上的ASP.NET ()方法中。
我还添加了一个AsyncUnitTests.cs类,它具有与Web API方法完全相同的代码。
奇怪的是,单元测试按照我的预期工作,而web api调用不是这样。
有谁有什么想法吗?
示例应用程序:WebAPIAsync.zip
发布于 2015-09-18 10:24:53
我已经解决了!WebAPIAsyncWorking.zip
本质上-所有等待调用都需要调用.ConfigureAwait(false)方法,以确保它可以在不同的上下文中继续。
为了将来参考,我已经在这里上传了工作解决方案...
https://stackoverflow.com/questions/32648951
复制