任务列表循环开始偏移量

List of Tasks Loop Start Offset

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

Int32 delayTime = 1500;

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

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

Task.Delay "Creates a cancellable task that completes after a specified time interval." (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 了解何时应使用 DelaySleep