HttpWebRequest和I/O完成端口

pet*_*ace 6 c# multithreading httpwebrequest threadpool io-completion-ports

我正在开发一个应用程序,它需要一种类型的消息才能访问数据库,而另一种类型的消息则需要一些外部的xml api.

我必须处理A LOT ...其中一个重大挑战是让HttpWebRequest类表现良好.我最初开始只使用标准的同步方法和线程整个事情.这不好.

因此,经过一些阅读后,我看到推荐的方法是使用Begin/End方法将工作委托给IO完成端口,从而释放线程池并产生更好的性能.这似乎不是这样的......性能稍微好一些,但我当然看不到与threadpool相比使用的IO完成端口.

我有一个旋转的线程,并向我发送线程池中可用的工作线程+完成端口.完成端口总是非常低(我看到最多使用9个)并且我总是使用大约120个工作线程(有时更多).我在以下所有方法中使用开始/结束模式httpwebrequest:

Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)
Run Code Online (Sandbox Code Playgroud)

我做得对吗?我错过了什么吗?我可以同时使用(有时)多达2048个http连接(来自netstat输出) - 为什么完成端口号会这么低?

如果有人能就如何处理这个管理工作线程,完成端口提供一些认真的建议,httpwebrequest那将非常感谢!

编辑:.NET是一个合理的工具吗?我可以使用.NET和System.Net堆栈获得大量的http连接吗?有人建议使用像WinHttp(或其他一些C++库)这样的东西,并从.NET中调用它,但这不是我特别想做的事情!

Jon*_*eet 6

我的理解是,你不打领带了一个I/O完成端口在异步请求未完成的时间-这是唯一的"忙"时,数据已返回和相应的线程上正在处理中.希望你没有非常多的工作在回调,这就是为什么你没有很多使用中的端口在任何一个时间做.

实际上是否表现不佳?您的原因仅仅是数量较少?您是否获得了预期的吞吐量?

可能遇到的一个问题是任何一台主机的HTTP连接池都相对较小.如果您对同一台计算机有数百个请求,那么默认情况下,实际上一次只会发出2个请求,以避免DoS攻击相关主机(并获得keep-alive的好处).您可以通过编程方式或使用app.config来增加此功能.当然,这可能不是您的问题,因为您已经解决了问题,或者因为您的所有请求都是针对不同的主机.(如果netstat显示2048个连接,则听起来不错.)