首页 > 解决方案 > 我怎样才能等待最少的时间?

问题描述

我有一个异步 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 中做到这一点?

标签: c#.netasynchronous

解决方案


最简单的:

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这避免了在立即完成的情况下所需的管道。


推荐阅读