如何在win表单应用程序中每分钟限制5个请求

时间:2014-11-02 20:31:13

标签: winforms throttling

我正在构建一个表单应用程序并按下一个循环的循环按钮,直到找到一些结果。但是这种循环正在请求一些服务器。我想在1分钟内将这些请求发送到最多5个请求。所以需要有一些逻辑在新的分钟开始之前一直在睡觉。请有人帮帮我吗?

这是我的代码:

        public int RPMCounter { get; set; }

        private async void SearchCheapestAuction()
        {
            bool foundItem = false;

            textBoxLogging.Clear();
            textBoxLogging.Text += System.Environment.NewLine + "start";

            // 1 stay loooping till you found this item for the buynowprice
            while (!foundItem)
            {
                // 2 check if this is request number 5 in one minute
                if (RPMCounter <= 5)
                {
                    // 3 increase counter
                    RPMCounter++;

                    // 4 set searchparameters
                    var searchParametersPlayers = new PlayerSearchParameters
                    {
                        MaxBid = (uint)Convert.ToInt16(textBoxMaxStartPrice.Text),
                        MinBid = (uint)Convert.ToInt16(textBoxMinStartPrice.Text),
                        MaxBuy = (uint)Convert.ToInt16(textBoxMaxBuyNow.Text),
                        MinBuy = (uint)Convert.ToInt16(textBoxMinBuyNow.Text)
                    };

                    // 5 run search query
                    var searchResponse = await client.SearchAsync(searchParametersPlayers);

                    // 8 check if the search found any results
                    if (searchResponse.AuctionInfo.Count > 0)
                    {

                        // 9 buy this player for the buy now price
                        var auctionResponse = await client.PlaceBidAsync(searchResponse.AuctionInfo.First(), searchResponse.AuctionInfo.First().BuyNowPrice);

                        // 10 stop searching/buying, I found my item for the right price
                        return;
                    }
                }
                else
                {
                    // 11 I access the 5 rpm, sleep till the next minutes begin and go search again?
                    return;
                }
            }

            textBoxLogging.Text += System.Environment.NewLine + "finished";
        }
}

1 个答案:

答案 0 :(得分:1)

我不会这样处理。
你设计它的方式将产生以下效果:你将以任意短的间隔连续5次发出服务器请求,然后你将等待一分钟并连续5次以任意短的间隔再次呼叫。
如果这是你打算做的,你能解释为什么你需要这样做吗? 只需将System.Timers.Timer间隔为12秒并检查您的请求是否已完成,即可将呼叫次数限制为每分钟5次。 如果是,并且您没有找到该项目,则可以创建一个新项目,如果不是,则可以等待下次计时器结束。

它可能看起来像这样:

private Timer _requestTimer;
private readonly object _requestLock = new object();
private bool _requestSuccessful;

private void StartRequestTimer()
{
    _requestTimer = new Timer(12 * 1000) { AutoReset = true };
    _requestTimer.Elapsed += requestTimer_Elapsed;
    _requestTimer.Start();
}

void requestTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    lock (_requestLock)
    {
        if (_requestSuccessful)
        {
            _requestTimer.Stop();
        }
        else
        {
            TryNewRequest();
        }
    }
}

private void TryNewRequest()
{
    lock (_requestLock)
    {
        //try a new asynchronous request here and set _requestSuccessful to true if successful
    }
}

在您的主要功能中,您首先拨打TryNewRequest(),然后拨打StartRequestTimer()。请注意,请求必须是异步的才能使其正常工作。