由于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;
}
答案 0 :(得分:2)
好吧,你将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();
P上。 S.从它的外观来看,正在使用.NET v4.0,但如果我弄错了你正在编译v4.5,你可以使用内置的Task.Delay method
。