2013-08-07 2 views
1

Из-за ограничения рейтинга твиттера на 180 запросов за 15 минут. Я сделал эту реализацию и отложил задачу. Но, похоже, это не работает. В чем проблема?Выполнение задержки с заданием

То, что я реализовал, на самом деле дает 15 минут ожидания после запроса 180. Является ли моя реализация правильной?

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

ответ

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.

+0

Спасибо, что вы сделали, добавит задержку для каждого запроса? То, что мне действительно нужно на 1-15 минут, может быть сделано. то через 2-15 минут может быть сделан еще 180 запросов. Я реализовал таким образом. –

+0

Проверьте мои изменения. Я думал, вы пытаетесь сделать то, что делает мое первое решение. В любом случае, оба вышеупомянутых будут достаточными, но решение 2 лучше, поскольку оно использует только одну «задачу» на 180 запросов. –

+0

+1 Еще раз спасибо. С решением 2, как он будет делать только 180 запросов за 15 минут? Можете ли вы объяснить код? я не видел никаких проверок в течение 15 минут и 180 запросов. –

Смежные вопросы