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
立即完成的情况下所需的管道.
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)