任务清单循环开始偏移

时间:2018-11-17 00:05:26

标签: c# multithreading task-parallel-library

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

Int32 delayTime = 1500;

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

但是,以上内容同时启动所有任务,而没有考虑任务延迟。有没有一种方法可以交错排列任务列表或以不同的方式组织它,以便我可以在上一个任务开始几秒钟后启动每个任务?

1 个答案:

答案 0 :(得分: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,了解何时应使用DelaySleep