2013-08-07 2 views
1

En raison de la limitation de 180 sur Twitter, une demande par 15 minutes. J'ai fait cette implémentation et retarder la tâche. Mais cela ne semble pas fonctionner. Quel est le problème avec cela?Mise en œuvre du délai avec tâche

Ce que j'ai implémenté est en fait donner 15 minutes d'attente après 180 demande. Si ma mise en œuvre est correcte?

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

Répondre

2

Eh bien, vous définissez timeToDelay-0 puis attendre timeToDelay * 5000 qui, étant donné l'ancien est également 0.

Solution 1 - Répartissez uniformément

Supposons que votre réseau n'a pas de retard et Toutes les demandes sont envoyées à Twitter immédiatement. Ensuite, afin de diffuser vos demandes régulièrement pendant les 15 minutes d'intervalle, vous devez retarder la demande i e précisément par 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++; 
} 

Solution 2 - Envoyez-les à la fois, attendez que le reste des 15 minutes pour passer

Je vais juste poster le code, c'est à peu près explicite.

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. Par le regard de celui-ci, utilisent v4.0 .NET, mais si je me trompe et vous compilez contre v4.5 vous pouvez utiliser le intégré Task.Delay method.

+0

Merci, Ce que vous avez fait va ajouter un délai pour chaque demande non? Ce dont j'ai vraiment besoin au 1er 15 min 180 demande peut être faite. puis 2ème 15 min une autre demande de 180 peut être faite. J'ai mis en place de cette manière. –

+0

Vérifier mes modifications. Je pensais que tu essayais de faire ce que ma première solution fait. Quoi qu'il en soit, les deux ci-dessus suffiront, mais la solution 2 est meilleure car elle n'utilise qu'un seul 'Task' pour 180 requêtes. –

+0

+1 Salut merci encore. Avec la solution 2, comment fera-t-il seulement 180 demandes par 15 minutes? Pouvez-vous expliquer le code? Je n'ai vu aucun chèque pour 15 minutes et 180 demandes. –