任务循环开始偏移列表

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

我试图遍历一个任务列表,并将每个任务的开始偏移特定的秒数,如:

Int32 delayTime = 1500;

List<Task> tasks = new List<Task>();
// .... add stuff to task list.
tasks.ForEach(task =>
{
    Task.Delay(delayTime);
    task.Start();
    delayTime += 1500;
});

但是,上面的所有任务都在一起,没有考虑任务延迟。有没有办法错开一个任务列表,或者以不同的方式构建它,这样我可以在前一个任务启动后几秒钟启动每个任务?

c# multithreading task-parallel-library
1个回答
3
投票

Task.Delay“创建一个可在指定时间间隔后完成的可取消任务。” (source)。所以基本上你的ForEach循环开始一个新的任务,它将在自己的线程上等待delayTime然后你在启动延迟后立即启动task

你应该await呼叫Task.Delay

Int32 delayTime = 1500;

List<Task> tasks = new List<Task>();
// .... add stuff to task list.
tasks.ForEach(async task =>
{
    await Task.Delay(delayTime);
    task.Start();
    delayTime += 1500;
});

使用Task.Delay(delayTime).Wait()

Int32 delayTime = 1500;

List<Task> tasks = new List<Task>();
// .... add stuff to task list.
tasks.ForEach(task =>
{
    Task.Delay(delayTime).Wait();
    task.Start();
    delayTime += 1500;
});

或使用Thread.Sleep(delayTime)将当前线程置于睡眠状态。

Int32 delayTime = 1500;

List<Task> tasks = new List<Task>();
// .... add stuff to task list.
tasks.ForEach(task =>
{
    Thread.Sleep(delayTime);
    task.Start();
    delayTime += 1500;
});

请参阅this SO question以了解何时应使用Delay vs Sleep

© www.soinside.com 2019 - 2024. All rights reserved.