【问题标题】:How to create task in loop and wait all task complete如何循环创建任务并等待所有任务完成
【发布时间】:2016-05-08 15:12:43
【问题描述】:
private async void button1_Click(object sender, EventArgs e)
{
   await BackupFile();
}


public async Task BackupFile()
{ 
  await Task.Run(() =>
  {
    for (var i = 0; i < partCount; i++)
    {
      upload(FilePart);//how to creat a new task at here
      //i don't want to wait here, i want to upload all part at same time
    }
    //wait here.
    //if total part got 10, then how to wait 10 task complete
    //after 10 task complete
    Console.WriteLine("Upload Successful");
  });
}

如何循环创建新任务以及如何等待所有任务完成 执行下一行代码

【问题讨论】:

  • 听说过async吗?这似乎适合这种情况。在将 upload-mehtod 重写为 async 后,您可以调用像 await upload(FilePart); 这样的 somtehing 等待操作完成。
  • 你可以只使用Parallel.For 并限制并发,但如果upload 可以被称为异步,你有更好的选择。有关并行执行异步任务的示例,请参阅 stackoverflow.com/a/11565317/224370
  • 我在打电话,所以只能发表评论,但您需要使您的 upload 函数异步,在您的 for 循环之前创建一个 List&lt;Task&gt;,将 upload(FilePart) 替换为 myList.Add(upload(FilePart)) ,最后在for 循环之后添加await Task.WhenAll(myList)。如果在我回到电脑前的几个小时内你还没有接受答案,我会给出完整的答案。
  • @Verbon 的答案是我所建议的,但请务必听取 CodeNotFound 和 ScottChamberlain 的建议。
  • 阅读 Stephen Cleary 关于 async-await 的精彩介绍:blog.stephencleary.com/2012/02/async-and-await.html

标签: c# .net multithreading async-await task


【解决方案1】:

你应该尝试任务组合器WhenAll:

public async Task BackupFileAsync()
{
    var uploadTasks = new List<Task>();
    for (var i = 0; i < partCount; i++)
    {
        var uploadTask = Task.Run(() => upload(FilePart));
        uploadTasks.Add(uploadTask)
    }

    await Task.WhenAll(uploadTasks);

    Console.WriteLine("Upload Successful");
}

【讨论】:

  • 您忘记将uploadTask 添加到uploadTasks 集合中
  • 它建议等待一个 Task 而不是像这样的 Task.Wait 方法await Task.WhenAll(uploadTasks);
  • 外部 task.run 毫无意义。摆脱它并等待WhenAll
  • 同意@ScottChamberlain。我认为var tasks = Enumerable.Range(0, partCount).Select(t =&gt; Task.Run(() =&gt; upload(FilePart))); await Task.WhenAll(tasks); 简单易读。
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 2012-12-09
  • 2011-03-17
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2017-04-14
  • 2021-10-21
相关资源
最近更新 更多