同时从远程服务下载JSON数据

时间:2011-07-27 22:20:36

标签: c# multithreading wcf json optimization

我通过HTTP同时从多个远程服务器提取JSON数据,在客户端和服务器端点上使用WCF服务。我注意到,对于每个连续的异步启动请求,http请求所花费的时间通常会增加,即使数据量不一定增加。换句话说,如果我启动12个线程池线程(使用Func<> .BeginInvoke),那么每个请求在被定时后都会在我的日志中显示:

  :HttpRequest invoked. Elapsed: 325ms
  :HttpRequest invoked. Elapsed: 27437ms
  :HttpRequest invoked. Elapsed: 28642ms
  :HttpRequest invoked. Elapsed: 28496ms
  :HttpRequest invoked. Elapsed: 32544ms
  :HttpRequest invoked. Elapsed: 38073ms
  :HttpRequest invoked. Elapsed: 41231ms
  :HttpRequest invoked. Elapsed: 47914ms
  :HttpRequest invoked. Elapsed: 45570ms
  :HttpRequest invoked. Elapsed: 61602ms
  :HttpRequest invoked. Elapsed: 53567ms
  :HttpRequest invoked. Elapsed: 79081ms

这个过程非常简单。我只是在循环中启动每个请求,然后在使用合并数据之前对所有操作调用.WaitAll()。

看起来Http请求占用的时间比使用少量数据时要长。实际上,小数据量和大量数据之间的差异总体上看起来很小。这种瓶颈是由于并发的http请求必须共享带宽,还是存在线程/上下文切换问题?只是想指向正确的方向。

编辑 - 为了清楚起见,我同步运行了同样的 过程,结果如下:

  :HttpRequest invoked. Elapsed: 20627ms
  :HttpRequest invoked. Elapsed: 16288ms
  :HttpRequest invoked. Elapsed: 2273ms
  :HttpRequest invoked. Elapsed: 4578ms
  :HttpRequest invoked. Elapsed: 1920ms
  :HttpRequest invoked. Elapsed: 564ms
  :HttpRequest invoked. Elapsed: 1210ms
  :HttpRequest invoked. Elapsed: 274ms
  :HttpRequest invoked. Elapsed: 145ms
  :HttpRequest invoked. Elapsed: 21447ms
  :HttpRequest invoked. Elapsed: 27001ms
  :HttpRequest invoked. Elapsed: 1957ms

总时间(因为它的同步)上升,但是您可以清楚地看到每个单独的请求通常更快。不幸的是,我不知道有任何方法来隔离问题 - 但我的猜测是它在线程之间的带宽共享问题。

所以我有一个更直截了当的问题是:

1)如果我使用非线程池线程,这会改善

2)我应该将操作分组到几个线程中,而不是每个请求都有自己的吗?

3)尝试通过Http同时下载数据时,这是一个标准问题吗?

3 个答案:

答案 0 :(得分:2)

根据this问题,有一个设置可以控制可以同时发出多少HTTP请求。此外,您应该在HttpWebRequest上使用BeginGetResponse方法进行并发下载,因为它比创建线程便宜。请查看here示例。

答案 1 :(得分:2)

可能与您的服务的并发模式有关。检查http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx并确保该服务不是单线程的。

答案 2 :(得分:0)

我最终想出的这个问题的最佳答案来自这个链接:

http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-are-wcf-responses-slow-and-setminthreads-does-not-work.aspx

如果您反复调用相同的servive方法,则适用。

通过在客户端和服务器上调整ThreadPool.SetMinThreads(),我得到了改进的结果。

然而,WCF仍有很多缓慢的问题,并且通过HTTP进行传输,我还没有真正深入到底。