我怎样才能等待最短的时间?

Jez*_*Jez 10 .net c# asynchronous

我有一个异步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());
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够确保每10秒钟不会发生一次HTTP请求.所以我想在循环开始时启动一个10秒计时器,最后说"等待完成10秒计时器".有没有办法在C#.NET中执行此操作?

Mar*_*ell 13

最简单的:

while (true) {
    var rateLimit = Task.Delay(TimeSpan.FromSeconds(10));
    // ...await your http/whatever
    await rateLimit;
}
Run Code Online (Sandbox Code Playgroud)

await rateLimit如果http工作超过10秒,将立即完成.

但是,您可以选择比较http工作之前和之后的时间,看看您是否需要等待; 更像:

while (true) {
    var timeBefore = ...
    // ...await your http/whatever
    var timeAfter = ...
    // ... calculate time left
    if (timeLeft > TimeSpan.Zero) await Task.Delay(timeLeft);
}
Run Code Online (Sandbox Code Playgroud)

这样可以避免在Task.Delay立即完成的情况下所需的管道.


Pou*_*Bak 5

StopWatch启动循环时创建(并启动它).

然后当GetAsync方法返回时,您将读取ElapsedMilliseconds.从10000减去此值.现在执行:

await Task.Delay(yourValue);
Run Code Online (Sandbox Code Playgroud)

现在需要分钟.一个循环10秒.

代码:

while (true) {
    // Long-poll the API

    StopWatch sw = StopWatch.StartNew();
    var response = await http.GetAsync(buildUri());

    Console.WriteLine("Resp: " + response.ToString());
    Console.WriteLine("CONTENT:");
    Console.WriteLine(await response.Content.ReadAsStringAsync());

    int milliseconds = 10000 - sw.ElapsedMilliSeconds;
    if (milliseconds > 0)
    {
        await Task.Delay(milliseconds);
    }
}
Run Code Online (Sandbox Code Playgroud)