我正在运行parallel.foreach循环以遍历列表。每个列表项都包含一个api的标识符,我正在循环中访问它。
我正在访问的api每分钟最多可以有225个请求,因此我想在220个项目后暂停执行循环,并在一分钟后再恢复它们。我尝试使用Thread.sleep(numMilliSeconds),但似乎为每个进入睡眠状态或类似性质的线程启动了一个新线程。
这大致就是我现在正在使用的内容:
Parallel.ForEach(list, (currentItem) =>{
while(numRequestsLastMinute > 220 && DateTime.Now.Minute == lastDownloadTime.Minute)
{
var timeToPause = (60 - DateTime.Now.Second) * 1000;
Console.WriteLine("Thread pausing for" + timeToPause/100 + "seconds...");
Thread.Sleep(timeToPause);
Console.WriteLine("Thread resuming...");
}
if(DateTime.Now.Minute > lastDownloadTime.Minute)
{
lastDownloadTime = DateTime.Now;
numRequestsLastMinute = 0;
}
//send requests
}
很显然,Thread.Sleep不是解决此问题的正确方法,但是在Parallel.Foreach循环中是否可以使用类似的构造?
int maxPerMinute = 220
while (list.Count > 0)
{
_ = Parallel.ForEach(batch, (currentItem) =>
{
});
batch = list.Take(maxPerMinute);
list = list.Skip(maxPerMinute).ToList();
Console.WriteLine(numItemsDone + " items downloaded");
if (DateTime.Now.Minute == lastDownloadTime.Minute)
{
var timeToPause = (60 - DateTime.Now.Second) * 1000;
Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Thread pausing for " + timeToPause / 1000 + "seconds...");
Thread.Sleep(timeToPause);
Console.WriteLine(DateTime.Now.ToLongTimeString() + ": Thread resuming...");
}
lastDownloadTime = DateTime.Now;
}//end while