c# - 我怎样才能等待最少的时间?
问题描述
我有一个异步 C# 方法,我在其中获取 HTTP 资源,并且我在无限循环中执行它。但是我不想太快地使用资源。我目前的代码是:
HttpClient http = new HttpClient();
while (true) {
// Long-poll the API
var response = await http.GetAsync(buildUri());
Console.WriteLine("Resp: " + response.ToString());
Console.WriteLine("CONTENT:");
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
但是,我希望能够确保每 10 秒发出一次 HTTP 请求的频率不会超过一次。所以我想在循环开始时启动一个 10 秒计时器,最后说“等待 10 秒计时器完成”。有没有办法在 C#.NET 中做到这一点?
解决方案
最简单的:
while (true) {
var rateLimit = Task.Delay(TimeSpan.FromSeconds(10));
// ...await your http/whatever
await rateLimit;
}
如果 http 工作超过 10 秒,await rateLimit
将立即完成。
不过你可以选择比较一下http工作前后的时间,看看是否还需要等待;更像:
while (true) {
var timeBefore = ...
// ...await your http/whatever
var timeAfter = ...
// ... calculate time left
if (timeLeft > TimeSpan.Zero) await Task.Delay(timeLeft);
}
Task.Delay
这避免了在立即完成的情况下所需的管道。
推荐阅读
- arrays - 拉会话项目后重写数组键
- javascript - 如何获取浏览器使用 Javascript 包装文本的位置
- javascript - 午夜时间显示为 24 而不是 00
- kubernetes - Kubernetes 中 AWS lambda 无服务器概念的替代方案?
- r - R中的两步函数
- javascript - 为什么类“大”只添加到数组的最后一个元素?
- google-apps-script - 如何使用带有属性的 clasp 运行 - 有效的 JSON 格式
- symfony - SYMFONY 中的 DOMPDF:缓存:清除
- javascript - 如何使用画布在javascript中拆分圆圈数组以在一半圆圈中显示数字,在另一半圆圈中显示字母
- python - 在以下数据框中为每个单元格查找重复值