现有的第三方 Rest API 可以接受一组输入并返回相同的输出。 (将其视为 Bing 的地理编码服务,它将接受地址并返回位置详细信息)
我的需要是针对单个 asp.net 请求多次调用此 API(比如 500-1000 次),每次调用可能需要将近 500 毫秒才能返回。
我可以想到三种方法来执行此操作。需要您就以速度为标准的最佳方法提出意见。
<强>1。在 for 循环中使用 Http Request
编写一个简单的 for 循环,为每个输入调用 REST API,并将输出添加到结果中。到目前为止,这可能是最慢的。但是没有线程或上下文切换的开销。
<强>2。使用异步和等待
使用 async 和 await 机制调用 REST Api。它可能是高效的,因为线程在等待 REST 调用返回时继续执行其他事件。我面临的问题是,根据建议,我应该一直等待到最顶层的调用者,这在我的情况下是不可能的。不遵循它可能会导致 asp.net 中出现死锁,如此处所述 http://msdn.microsoft.com/en-us/magazine/jj991977.aspx
<强>3。使用任务并行库
使用 Parallel.ForEach 并使用 Synchronuos API 并行调用服务器并使用 ConcurrentDictionary
保存结果。但是可能会导致线程开销
另外,请告诉我是否还有其他更好的处理方式。我知道人们可能会建议跟踪每种方法的性能,但我想了解人们之前是如何解决这个问题的
最佳答案
最好的解决方案是使用 async
和 await
,但在那种情况下你将必须采用 async
从调用堆栈一直向上到 Controller 操作。
for 循环保持顺序和同步,因此它肯定是最慢的解决方案。 Parallel
会阻塞每个请求的多个线程,这会对您的可扩展性产生负面影响。
由于操作是基于 I/O 的(调用 REST API),async
是最自然的选择,并且应该提供这些选项的最佳整体系统性能。
关于asp.net - 是否使用 TPL 或 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22064210/