3

我目前正在编写一个应用程序,它大量调用产生很少输出的慢速 Web 服务(我在那种模式中没有发言权)。我想进行 100 次并行调用(我知道真正的并行性只能达到你有核心的程度)。但我想知道它们是否是不同方法之间的性能差异。

我在犹豫:

  • 在循环中使用 Task.Factory.StartNew。
  • 使用 Parallel.For。
  • 使用后台工作者。
  • 使用 AsyncCallback。
  • ...其他?

我的主要目标是尽快启动尽可能多的 Web 服务调用。我应该如何进行?

4

2 回答 2

8

从性能的角度来看,这不太重要。正如您自己所描述的,您的程序中的瓶颈是对执行缓慢的 Web 服务的网络调用。 将是瓶颈。启动新线程或管理它们需要多长时间的任何差异都不太重要,因为它们会被网络交互所掩盖。

您应该使用您最熟悉的模型/框架,这将最有效地允许您编写您知道是正确的代码。同样重要的是要注意,您实际上根本不需要在您的机器上使用多个线程。您可以从同一个线程向 Web 服务发送多个异步请求,甚至可以在同一个线程中处理所有回调。并行发送请求不太可能对性能产生任何有意义的影响。因此,您实际上不需要使用您描述的任何框架,尽管任务并行库实际上在管理异步操作方面非常有效,即使这些操作不代表另一个线程中的工作。你不它,但它肯定能够提供帮助。

于 2013-05-13T15:15:03.703 回答
2

根据您的建议,我以前使用 TLP 时使用了 Async(带有 I/O 事件)。Async 确实优于 Sync + Task 的使用。

我现在可以同时启动 100 个请求(几乎?),如果运行时间最长的请求需要 5 秒,那么整个过程将只持续 7 秒,而使用 Sync + TLP 时我花了大约 70 秒。

总之,(自动生成的)Async 确实是使用大量 Web 服务时要走的路。

谢谢大家。

哦,顺便说一句,如果没有,这是不可能的:

<connectionManagement>
  <add address="*" maxconnection="100" />
</connectionManagement>
于 2013-05-14T09:31:38.977 回答