我需要从 C# 控制台应用程序发出 100,000 个轻量级(即小内容长度)Web 请求。我可以做到这一点的最快方法是什么(即在尽可能短的时间内完成所有请求)以及我应该遵循哪些最佳实践?我不能一劳永逸,因为我需要捕获响应。
大概我想用async
web 请求方法,但是我想知道存储所有的开销有什么影响Task
延续和编组将是。
内存消耗不是总体问题,目标是速度。
想必我也想利用所有可用的核心。
所以我可以做这样的事情:
Parallel.ForEach(iterations, i =>
{
var response = await MakeRequest(i);
// do thing with response
});
但这不会让我比我的核心数量更快。
我可以:
Parallel.ForEach(iterations, i =>
{
var response = MakeRequest(i);
response.GetAwaiter().OnCompleted(() =>
{
// do thing with response
});
});
但我如何让我的程序在ForEach
。坚持所有的Tasks
and WhenAll
使它们感觉臃肿,是否有任何现有的模式或助手可以拥有某种任务队列?
有什么方法可以变得更好,我应该如何处理限制/错误检测?例如,如果远程端点响应缓慢,我不想继续向它发送垃圾邮件。
我明白我还需要做:
ServicePointManager.DefaultConnectionLimit = int.MaxValue
还有什么必要的吗?
The Parallel
类不适用于异步循环体,因此您无法使用它。您的循环体几乎立即完成并返回一个任务。这里没有并行性的好处。
这是一个非常简单的问题。使用一个标准解决方案来使用给定的 DOP 异步处理一系列项目(这个很好:http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx。使用最后一段代码)。
您需要凭经验确定正确的 DOP。只需尝试不同的值即可。没有理论上的方法可以得出最佳价值,因为它取决于许多因素。
连接限制是您遇到的唯一限制。
response.GetAwaiter().OnCompleted
不确定你试图在那里完成什么......如果你发表评论,我会解释这个误解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)