C#多线程,表现最好?

时间:2013-05-13 15:02:46

标签: c# web-services parallel-processing

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

我在犹豫之间犹豫不决:

  • 在循环中使用Task.Factory.StartNew。
  • 使用Parallel.For。
  • 使用BackgroundWorker。
  • 使用AsyncCallback。
  • ...别人?

我的主要目标是尽可能快地启动尽可能多的Web服务调用。 我该怎么办?

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

根据你的意见,我在使用TLP时使用了Async(带有I / O事件)。 Async确实胜过Sync + Task的使用。

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

总之,(自动生成)Async实际上是消耗大量Web服务的方式。

谢谢大家。

哦顺便说一下,如果没有:

,这是不可能的
<connectionManagement>
  <add address="*" maxconnection="100" />
</connectionManagement>