【问题标题】:List of Tasks Loop Start Offset任务列表循环开始偏移
【发布时间】:2018-11-17 00:05:26
【问题描述】:

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

Int32 delayTime = 1500;

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

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

【问题讨论】:

  • 你应该在 foreach 中等待任务

标签: c# multithreading task-parallel-library


【解决方案1】:

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

【讨论】:

  • 谢谢。我错过了.Wait()。现在它正在工作。我不想让实际线程进入睡眠状态,因为担心它可能会阻止在同一线程上运行的另一个任务。
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 2012-01-07
  • 2012-08-31
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多