c# - 在等待 List<Task> 中的所有任务完成时显示进度

标签 c# .net asynchronous async-await task

我目前正在尝试在一行的末尾连续打印点作为不确定进度的一种形式,同时运行大量任务,使用以下代码:

start = DateTime.Now;
Console.Write("*Processing variables");
Task entireTask = Task.WhenAll(tasks);
Task progress = new Task(() => { while (!entireTask.IsCompleted) { Console.Write("."); System.Threading.Thread.Sleep(1000); } });
progress.Start();
entireTask.Wait();
timeDiff = DateTime.Now - start;
Console.WriteLine("\n*Operation completed in {0} seconds.", timeDiff.TotalSeconds);

在哪里tasks来自List<Task> tasks = new List<Task>(); ,
tasks.Add(Task.Run(() => someMethodAsync()));已经发生了 10000 次。
此代码目前有效,但是,这是实现此目的的正确方法吗?这是最具成本效益的方法吗?

最佳答案

正如 Thomas 所提到的,当然有几种方法可以处理这个问题。我立刻想到的是:

start = DateTime.Now;
Console.Write("*Processing variables");
Task entireTask = Task.WhenAll(tasks);
while (await Task.WhenAny(entireTask, Task.Delay(1000)) != entireTask)
{
  Console.Write(".");
}
timeDiff = DateTime.Now - start;
Console.WriteLine("\n*Operation completed in {0} seconds.", timeDiff.TotalSeconds);

请注意,此方法确实使用了 await,因此要求此方法是 async。通常对于控制台应用程序,我建议有一个 Main 只需调用 MainAsync,这样您的阻塞(或主循环)就全部在一行代码中而不与任何逻辑混合。

关于c# - 在等待 List<Task> 中的所有任务完成时显示进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36149241/

相关文章:

c# - Azure Cosmos-db 重命名文档属性

c# - 使用 .Net Socket 从 http 服务器下载并保存文件

c# - 为跨多个程序集的特定类型的实例实现中央 'manager' 类

C# LINQ 在单次执行中从列表中删除多个对象

JavaScript:一个一个地执行异步函数

c# - 如何简化我的代码?

c# - 使用hangfire在分布式环境中每天发送电子邮件

c# - 使用包含其他子组的 Active Directory 组的 Web.config 授权问题

c# - 如何在后台异步从流中读取数据

javascript - node.js,bluebird,执行路径控制不好