【问题标题】:How can I insert a delay between a List of Task<int>?如何在 Task<int> 列表之间插入延迟?
【发布时间】:2020-08-01 22:32:37
【问题描述】:

我有一个创建 5 个任务的循环。如何在每个任务之间插入 5 秒的延迟。我不知道如何将 Task.Delay(5000) 放在那里。

 var tasks = new List<Task<int>>();

 for (var i = 0; i < 5; i++)
 {  
      tasks.Add(ProcessQueueAsync());
 }

 await Task.WhenAll(tasks);

我的 ProcessQueAsync 方法调用服务器,检索数据并返回 int。

  private async Task<int> ProcessQueAsync()
  {
     var result = await CallToServer();
     return result.Count;
  }

【问题讨论】:

  • “插入 5 秒的延迟”到底是什么意思?任务本质上是异步的;如果可能,它们将并行运行。您究竟希望延迟发生在哪里?
  • 我知道想要这个似乎有点疯狂。我有一个正在读取的队列,因为所有五个任务一起运行,它们都读取数据库中的相同记录。没有完全重新设计和了解队列应该如何工作,我只想要一个延迟,这样我就可以读取和处理一堆记录,然后读取下一批,等等。我想我只有五个进程开始读取并很快更新我的数据库,但我并没有考虑清楚!也许我应该放弃 Task/async/await 并同步执行。谢谢
  • @ScottG 我认为你应该问一个关于你真正想要做什么的新问题。 XY-问题。

标签: c# async-await


【解决方案1】:
 for (var i = 0; i < 5; i++)
 {  
      tasks.Add(ProcessQueueAsync());
      await Task.Delay(5000);
 }

或者:

 for (var i = 0; i < 5; i++)
 {  
      await ProcessQueueAsync();
      await Task.Delay(5000);
 }

取决于你想要的。

【讨论】:

    【解决方案2】:

    如果您希望任务一个接一个地运行,延迟 5 秒,您或许应该查看Task.ContinueWith 而不是使用Task.WhenAll。这将允许您以串行方式而不是并行方式运行任务。

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2015-06-15
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多