执行任务延迟

本文关键字:延迟 执行任务 | 更新日期: 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