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

Sea*_*man 6 c# optimization wcf multithreading json

我在客户端和服务器端点上使用WCF服务通过HTTP同时从多个远程服务器提取JSON数据.我注意到,对于每个连续的异步启动请求,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
Run Code Online (Sandbox Code Playgroud)

这个过程非常简单.我只是在循环中启动每个请求,然后在使用合并数据之前对所有操作调用.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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Sea*_*man 0

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

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

如果您重复调用相同的服务方法,则适用这一点。

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

然而,WCF 和通过 HTTP 传输仍然存在很多缓慢问题,我还没有真正弄清楚。