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