在 C# 中发送 http 请求时,如何设置计时器或等待?

Posted

技术标签:

【中文标题】在 C# 中发送 http 请求时,如何设置计时器或等待?【英文标题】:How can I put a timer or wait when sending http requests in c#? 【发布时间】:2020-08-20 11:49:24 【问题描述】:

我将以编程方式向 api 发送超过 100 万个请求。看起来每 200 个请求我都会受到限制,需要等待 5 分钟才能再发送 200 个请求。如何通过 c# 代码执行此操作?我看过计时器,但我很困惑逻辑是如何工作的。有人可以帮我吗?

非常感谢!

【问题讨论】:

每 200 次调用只需使用 System.Threading.Thread.Sleep(300000);。它会让你的线程暂停并等待 5 分钟,然后再执行下一条语句。但是您想发送 100 万个请求,并且您希望每 200 个请求等待 5 分钟。因此,您将等待 5 分钟 5000 次 = 25 000 分钟 = 416 小时 = 17 天!!!!你确定要这样做吗? 每 5 分钟 200 个请求意味着您必须连续运行 17 天以上才能完成所有 100 万个请求。 @RonBeyer 我希望它不是一个交通信息应用程序:D @OlivierDepriester 或者用户需要加载记录 #986,594 的东西... 【参考方案1】:

正如 Ron Beyer 指出的那样,数学对您不利。如果您每 200 个请求就受到限制,则需要 5000 个周期才能完成全部 100 万个请求。 Wich 至少等于 25000 分钟,或 416 小时,或 17.36 天。这是最少时间,假设请求本身不需要任何时间。

我想应该说 API 提供者不希望你这样做。虽然您可以限制您的请求以进行匹配,但这并不重要,因为 17 天 对于任何应用程序来说都可能有点长。您需要一个数据库表来存储请求的总数以及您设法处理这 100 万个请求的程度。

这样做的唯一方法是,如果有一个允许批量请求的 API 调用。有了网络开销,很明显,对 200 个项目的 1 个请求将不会像每个对 1 个项目的 200 个请求一样长。但为此,您必须与 API 提供者交谈。

【讨论】:

我猜任何受限制的 API 也有一个(付费的)非受限制的 API,OP 可以使用它来更快地获取这些数据,他们只是试图在“免费”API。 这并不是问题的真正答案。 @MikeH “95% 的数字不可能”不是一个有效的答案? @MikeH 您知道有多少进程将超过两周作为可接受的运行时间?我指的不是服务器,而是实际的单一操作。 @Christopher 我的立场是这“不是答案”。非常适合发表评论。【参考方案2】:

您可以使用 Reactive Extensions TimeShifting Sequences 来实现此目的。可以查看例子here

如果您想要自己的实现,可以查看:

https://codeburst.io/throttling-concurrent-outgoing-http-requests-in-net-core-404b5acd987b

【讨论】:

以上是关于在 C# 中发送 http 请求时,如何设置计时器或等待?的主要内容,如果未能解决你的问题,请参考以下文章

c#使用多线程发送HTTP请求的问题,高手进!~~~

如何在 Visual C# 中发送 HTTP 2.0 请求

如何在不使用 System.Net 类的情况下在 C# 中发送 HTTP 请求? [复制]

C#定时器接收定时发送和处理接收socket异步通信,接收值放在静态变量里,有时候收到的数据不完整。

如何通过 HTTP 使用 Java(或 C#)中的摘要身份验证 HTTP 发送 SOAP 请求?

C# HttpClient:如何在 POST 请求中发送查询字符串