暂停Parallel.Foreach循环

问题描述 投票:0回答:1

我正在运行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循环中是否可以使用类似的构造?

c# parallel.foreach pause
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.