执行任务延迟
本文关键字:延迟 执行任务 | 更新日期: 2023-09-27 18:26:38
由于twitter评级限制为每15分钟180次请求。我做了这个实施和任务的延迟。但它似乎不起作用。这有什么问题?
我实现的实际上是在180次请求后等待15分钟。我的实施是否正确?
var currentRequestIndex = 1;
var timeToDelay = 0;
foreach (var item in items)
{
var contactFeed = item;
if(currentRequestIndex % 180 == 0)
{
timeToDelay = currentRequestIndex*5000;
}
Delay(timeToDelay * 5000).ContinueWith(_ => Task.Factory.StartNew(
() =>
-- call to twitter api here
));
currentRequestIndex++;
}
public Task Delay(int milliseconds)
{
var tcs = new TaskCompletionSource<object>();
new Timer(_ => tcs.SetResult(null)).Change(milliseconds, -1);
return tcs.Task;
}
好吧,将timeToDelay
设置为0,然后等待timeToDelay * 5000
,假设前者也是0。
解决方案1-均匀分布
假设你的网络没有延迟,所有请求都会立即发送到twitter。然后,为了在15分钟的时间间隔内平均分配您的请求,您应该将第i
个请求延迟i * 15 * 6000 / 180
foreach (var item in items)
{
var contactFeed = item;
delayTime = currentRequestIndex * 15 * 6000 / 180;
Delay(timeToDelay).ContinueWith(_ => Task.Factory.StartNew(
() =>
-- call to twitter api here
));
currentRequestIndex++;
}
解决方案2-一次发送所有邮件,等待剩余的15分钟通过
我只是发布代码,它几乎是不言自明的。
Action makeRequests = () =>
{
DateTime start = DateTime.Now;
foreach (var item in items)
{
// Call twitter api here
}
TimeSpan diff = DateTime.Now - start;
Delay(15 * 6000 - diff.Milliseconds).ContinueWith(_ => Task.StartNew(makeRequests));
};
makeRequests();
第页。S.从外观上看,它使用的是.NET v4.0,但如果我弄错了,并且您是针对v4.5进行编译的,那么您可以使用内置的Task.Delay method
。