1

由于 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;
}
4

1 回答 1

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();

PS 从外观上看,正在使用 .NET v4.0,但如果我弄错了,并且您正在针对 v4.5 进行编译,您可以使用内置的 .NET v4.0 Task.Delay method

于 2013-08-07T06:34:10.587 回答