任务循环开始偏移列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任务循环开始偏移列表相关的知识,希望对你有一定的参考价值。

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

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“创建一个可在指定时间间隔后完成的可取消任务。” (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

以上是关于任务循环开始偏移列表的主要内容,如果未能解决你的问题,请参考以下文章

我有一个具有偏移参数并想要循环的函数

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

如何在片段中填充列表视图?

VS2015 代码片段整理

Android - 为列表视图填充适配器的异步任务

无法从 onListItemClick 开始片段