我正在尝试遍历任务列表,并将每个任务的开始偏移特定的秒数,例如:
Int32 delayTime = 1500;
List<Task> tasks = new List<Task>();
// .... add stuff to task list.
tasks.ForEach(task =>
{
Task.Delay(delayTime);
task.Start();
delayTime += 1500;
});
但是,以上内容同时启动所有任务,而没有考虑任务延迟。有没有一种方法可以交错排列任务列表或以不同的方式组织它,以便我可以在上一个任务开始几秒钟后启动每个任务?
答案 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,了解何时应使用Delay
与Sleep
。