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同时下载数据时这是一个标准问题吗?
我最终想出的这个问题的最佳答案来自这个链接:
如果您重复调用相同的服务方法,则适用这一点。
通过在客户端和服务器上调整 ThreadPool.SetMinThreads(),我能够获得改进的结果。
然而,WCF 和通过 HTTP 传输仍然存在很多缓慢问题,我还没有真正弄清楚。
归档时间: |
|
查看次数: |
440 次 |
最近记录: |