asp.net - 是否使用 TPL 或 async/await

标签 asp.net .net asynchronous task-parallel-library async-await

现有的第三方 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 保存结果。但是可能会导致线程开销

另外,请告诉我是否还有其他更好的处理方式。我知道人们可能会建议跟踪每种方法的性能,但我想了解人们之前是如何解决这个问题的

最佳答案

最好的解决方案是使用 asyncawait,但在那种情况下你必须采用 async 从调用堆栈一直向上到 Controller 操作。

for 循环保持顺序和同步,因此它肯定是最慢的解决方案。 Parallel 会阻塞每个请求的多个线程,这会对您的可扩展性产生负面影响。

由于操作是基于 I/O 的(调用 REST API),async 是最自然的选择,并且应该提供这些选项的最佳整体系统性能。

关于asp.net - 是否使用 TPL 或 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22064210/

相关文章:

c# - virtual 关键字对 Entity Framework 5 中的实体属性有什么影响?

javascript - 从动态创建的下拉列表中获取值

.net - 如何在不需要运行 .net 框架的情况下创建 C++ 程序(如 ccleaner 和 utorrent)

javascript - 在 ajax 更新期间离开网页

c# - 如何限制c#中的最大并行任务数

android - 如何从 asp.net web 服务检索 base64 字符串到 android

asp.net - IIS Express 捕获所有子域 url

c# - .net 桌面应用程序 - 如何存储/更改应用程序设置或连接字符串?

java - 网络应用程序/网络服务器分离

java - Jersey 异步 ContainerRequestFilter