Tag: io completion ports

HttpWebRequest和I / O完成端口

我正在开发一个应用程序,它需要一种类型的消息才能访问数据库,而另一种类型的消息要去一些外部的xml api。 我必须处理A LOT …其中一个重大挑战是让HttpWebRequest类表现良好。 我最初开始只使用标准的同步方法和线程整个事情。 这不好。 因此,经过一些阅读后,我看到推荐的方法是使用Begin / End方法将工作委托给IO完成端口,从而释放线程池并产生更好的性能。 这似乎不是这样的……性能稍微好一些,但我当然看不到与threadpool相比使用的IO完成端口。 我有一个旋转的线程,并向我发送线程池中可用的工作线程+完成端口。 完成端口总是非常低(我看到的最大值是9)并且我总是使用大约120个工作线程(有时更多)。 我对httpwebrequest所有方法使用开始/结束模式: Begin/EndGetRequestStream Begin/EndWrite (Stream) Begin/EndGetResponse Begin/EndRead (Stream) 我做得对吗? 我错过了什么吗? 我可以同时使用(有时)多达2048个http连接(来自netstat输出) – 为什么完成端口号会这么低? 如果有人可以就如何处理这个管理工作线程,完成端口和httpwebrequest提供一些认真的建议,那将非常感激! 编辑:.NET是一个合理的工具吗? 我可以使用.NET和System.Net堆栈获得大量的http连接吗? 有人建议使用类似WinHttp(或其他一些C ++库)的东西,并从.NET中调用它,但这不是我特别想做的事情!

使用ConfigureAwait进行C#async / await链接(false)

基于众多书籍和博客,包括这里的优秀书籍,很明显当一个人写一个暴露助手异步方法的DLL库,即包装器方法时,通常认为内部完成实际异步方法的I / O任务的最佳实践在这样的线程池线程上(为了简洁起见,下面显示了伪代码,我以HttpClient为例) public Async Task MyMethodAsync(..) { … var httpClient = new HttpClient(..); var response = await httpClient.PostAsJsonAsync(..).ConfigureAwait(false); … return response; } 这里的关键是使用ConfigureAwait(false)以便在线程池线程上而不是在原始线程上下文上发生IO任务完成,从而可能防止死锁。 我的问题是从来电者的角度来看。 我对调用者和上面的方法调用之间存在多层方法调用的情况特别感兴趣,如下例所示。 CallerA -> Method1Async -> Method2Async -> finally the above MyMethodAsync 仅对最终方法使用ConfigureAwait(false)是否足够,还是应该确保Method1Async和Method2Async还在内部使用ConfigureAwait(false)调用其异步方法? 将它包含在所有这些中间方法中似乎很愚蠢,特别是如果Method1Async和Method2Async只是最终调用MyMethodAsync重载。 有任何想法,请指教! 更新了示例所以如果我有一个包含以下私有异步方法的库, private async Task MyPrivateMethodAsync(MyClass myClass) { … return await SomeObject.ReadAsStringAsync().ConfigureAwait(false); } 我应该确保以下公共重载方法还包括ConfigureAwait(false),如下所示? public async Task […]