如何尽快有效地制作1000个Web请求
我需要从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
和WhenAll
他们感到臃肿时,是否有任何现有的模式或帮助者拥有某种任务队列?
有没有办法让它变得更好,我该如何处理限制/错误检测? 例如,如果远程端点响应缓慢,我不想继续发送垃圾邮件
我明白我还需要这样做:
ServicePointManager.DefaultConnectionLimit = int.MaxValue
有什么必要吗?
Parallel
类不适用于异步循环体,因此您无法使用它。 你的循环体几乎立即完成并返回一个任务。 这里没有并行优势。
这是一个非常容易的问题。 使用标准解决方案之一与给定DOP异步处理一系列项目(这个很好: http : //blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx 。使用最后一段代码)。
您需要凭经验确定正确的DOP。 只需尝试不同的价值观 没有理论方法来获得最佳价值,因为它取决于许多事物。
连接限制是唯一的限制。
response.GetAwaiter()。OnCompleted
不知道你想在那里完成什么……如果你评论我会解释这个误解。
您要执行的操作是
- 调用I / O方法
- 处理结果
你应该使用I / O方法的async
版本是正确的。 更重要的是,您只需要1个线程即可启动所有I / O操作。 你不会在这里受益于并行性。
您将受益于第二部分中的并行性 – 处理结果,因为这将是一个CPU绑定操作。 幸运的是, async
/ await
将为您完成所有工作。 控制台应用程序没有同步上下文。 这意味着await
之后的方法部分将在线程池线程上运行,最佳地利用所有CPU内核。
private async Task MakeRequestAndProcessResult(int i) { var result = await MakeRequestAsync(); ProcessResult(result); } var tasks = iterations.Select(i => MakeRequestAndProcessResult(i)).ToArray();
要在具有同步上下文的环境中实现相同的行为(例如WPF或WinForms),请使用ConfigureAwait(false)
。
var result = await MakeRequestAsync().ConfigureAwait(false);
要等待任务完成,您可以await Task.WhenAll(tasks)
方法中使用await Task.WhenAll(tasks)
或在Main()
Task.WaitAll(tasks)
Main()
。
在Web服务上投掷100k请求可能会导致它被删除,因此您必须限制它。 您可以查看此问题的答案,以找到一些选项。
如果你明确设置了ParallelOptions参数的MaxDegreeOfParallelism属性(在有参数的ForEach的重载中),Parallel.ForEach应该能够使用比核心更多的线程 – 请参阅https://msdn.microsoft.com/en -us /库/ system.threading.tasks.paralleloptions.maxdegreeofparallelism(v = vs.110)的.aspx
您应该能够将其设置为1,000以使其使用1,000个线程甚至更多,但由于线程开销,这可能效率不高。 您可能希望进行实验(例如,循环从例如100到1000步进100秒以尝试每次和时间开始完成提交1,000个请求)或甚至设置某种自我调整算法。
上述就是C#学习教程:如何尽快有效地制作1000个Web请求分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1003488.html