我正在构建一个表单应用程序并按下一个循环的循环按钮,直到找到一些结果。但是这种循环正在请求一些服务器。我想在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";
}
}
答案 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()
。请注意,请求必须是异步的才能使其正常工作。