gpt4 book ai didi

c# - 如何尽快有效地发出 1000 多个 Web 请求

转载 作者:太空狗 更新时间:2023-10-30 01:33:16 25 4
gpt4 key购买 nike

我需要从 C# 控制台应用发出 100,000 次轻量级(即小内容长度)网络请求。最快的方法是什么(即在尽可能短的时间内完成所有请求)以及我应该遵循哪些最佳实践?我不能一发不可收拾,因为我需要捕获响应。

大概我想使用 async 网络请求方法,但是我想知道存储所有 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 之后运行。坚持所有的 TasksWhenAll 感觉臃肿,是否有任何现有的模式或助手来拥有某种任务队列?

有什么方法可以改善吗?我应该如何处理节流/错误检测?例如,如果远程端点响应缓慢,我不想继续向它发送垃圾邮件。

我明白我还需要做:

ServicePointManager.DefaultConnectionLimit = int.MaxValue

还有什么需要的吗?

最佳答案

Parallel 类不适用于异步循环体,因此您不能使用它。您的循环体几乎立即完成并返回一个任务。这里没有并行优势。

这是一个非常简单的问题。使用一个标准解决方案来使用给定的 DOP 异步处理一系列项目(这个很好:http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx。使用最后一段代码)。

您需要凭经验确定正确的 DOP。只需尝试不同的值。没有理论上的方法可以得出最佳值(value),因为它取决于很多因素。

连接限制是您的唯一限制。

response.GetAwaiter().OnCompleted

不确定您在那里尝试完成什么...如果您发表评论,我会解释误解。

关于c# - 如何尽快有效地发出 1000 多个 Web 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com