c# – 多线程WebRequest调用和争用

c# – 多线程WebRequest调用和争用,第1张

概述我正在运行一个多线程的C#控制台应用程序.核心流程检索要处理的一些数据,将其拆分为可配置数量的较小数据集,然后生成相同数量的线程以处理每个数据子集. 要处理单个记录,线程必须使用WebRequest类和POST方法调用Web服务.查询与GetRequestStream()一起发送,并使用GetResponse()检索响应. 在伪代码中,例程看起来像这样: prepare WebRequest da 我正在运行一个多线程的C#控制台应用程序.核心流程检索要处理的一些数据,将其拆分为可配置数量的较小数据集,然后生成相同数量的线程以处理每个数据子集.

要处理单个记录,线程必须使用WebRequest类和POST方法调用Web服务.查询与GetRequestStream()一起发送,并使用GetResponse()检索响应.

在伪代码中,例程看起来像这样:

prepare WebRequest data;* get time (start-of-Processing);Stream str = request.GetRequestStream();Write data to stream;stream.Close();WebResponse resp = request.GetResponse();* get time (response-received);process response;finally close response stream;

时序数据表明,当我们将数据分成4个以上的线程时,整个过程的吞吐量不会提高,有时甚至会下降.来自Web服务的定时数据保持其性能保持不变.

> 4线程,我们的明显开销
发送数据并检索
响应流平均值围绕a
第二.
>当我们运行超过4个线程时,
平均值随最大值上升
遇到了几十秒!

今天我能够运行两个独立的进程,每个进程运行4个线程(但基本上确保每个线程仍在独特的数据上运行).这次,我们的整体吞吐量几乎翻了一番,每个流程都有大约一秒钟的稳定时间.

这让我相信我们对WebRequest类的资源有某种限制;但它是每个进程的限制,而不是机器限制.我知道我们可以使用BeginGetRequestStream和BeginGetResponse异步调用我们的调用,但我怀疑如果我们实际上达到某种资源限制会产生积极影响吗?!

我应该注意什么才能使我们在单一过程中提高分割数量而不会降低性能?

解决方法 您需要增加可以对单个主机发出的同时Web请求的数量 – 否则您的线程基本上将等待彼此完成,尽管有足够的cpu可用.最简单的方法是使用< connectionManagement> app.config的元素:

<configuration>  <system.net>    <connectionManagement>      <add address = "*" maxconnection = "100" />    </connectionManagement>  </system.net></configuration>
@H_403_48@ 总结

以上是内存溢出为你收集整理的c# – 多线程WebRequest调用和争用全部内容,希望文章能够帮你解决c# – 多线程WebRequest调用和争用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222836.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存