用任务实现延迟

时间:2013-08-07 06:18:51

标签: c# task

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

1 个答案:

答案 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