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

さて、0 に設定してから、前者も 0 になるtimeToDelayまで待ちます。timeToDelay * 5000

解決策 1 - 均等に広げる

ネットワークにラグがなく、すべてのリクエストがすぐに Twitter に送信されると仮定しましょう。次に、15 分の間隔でリクエストを均等に分散させるために、i正確に th リクエストを遅らせる必要があります。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を使用できますTask.Delay method

于 2013-08-07T06:34:10.587 に答える