我通过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同时下载数据时,这是一个标准问题吗?
答案 0 :(得分:2)
根据this问题,有一个设置可以控制可以同时发出多少HTTP请求。此外,您应该在HttpWebRequest上使用BeginGetResponse方法进行并发下载,因为它比创建线程便宜。请查看here示例。
答案 1 :(得分:2)
可能与您的服务的并发模式有关。检查http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx并确保该服务不是单线程的。
答案 2 :(得分:0)
我最终想出的这个问题的最佳答案来自这个链接:
如果您反复调用相同的servive方法,则适用。
通过在客户端和服务器上调整ThreadPool.SetMinThreads(),我得到了改进的结果。
然而,WCF仍有很多缓慢的问题,并且通过HTTP进行传输,我还没有真正深入到底。