我有一个需要一次处理项目 3 的函数,如果总时间少于 x 秒,线程应该在继续进行之前休眠剩余的秒数。
所以我正在做以下事情:
private void ProcessItems()
{
for (int i = 0, n = items.Count; i < n; i++)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
batch.Add(items[i]);
if (batch.Count == 3 || i >= items.Count - 3)
{
List<Task> tasks = new List<Task>(3);
foreach (Item item in batch)
tasks.Add(Task.Factory.StartNew(() => ProcessItem(item)));
Task.WaitAll(tasks.ToArray());
batch.Clear();
}
stopwatch.Stop();
int elapsed = (int)stopwatch.ElapsedMilliseconds;
int delay = (3000) - elapsed;
if (delay > 0)
Thread.Sleep(delay);
}
}
ProcessItem 函数发出网络请求并处理响应(回调)。这是需要少量时间的功能。
但是,如果我正确理解任务,一个线程可以有多个任务。因此,如果我让线程休眠,其他任务可能会受到影响。
有没有更有效的方法来实现上述目标,是否可以在 Parallel.Foreach 中使用任务?