如何在异步任务中更新主进度条和子进度条?
我正在使用here找到的ShellProgressBar,ShellProgressBar支持子进度条。当我运行async
任务时,进度条不会更新。
我尝试了几种不同的方法来更新进度条,我可以得到的最接近的方法如下。
private const int NumberOfProcesses = 4;
private const int TicksPerProcess = 1000;
static async Task Main(string[] args)
{
var processes = new List<Task>();
using (var pbar = new ProgressBar(NumberOfProcesses * TicksPerProcess, "Main Progress bar"))
{
for (int i = 0; i < NumberOfProcesses; i++)
{
Console.WriteLine($"Process: i");
var task = Process(pbar);
processes.Add(task);
}
}
await Task.WhenAll(processes.ToArray());
Console.WriteLine("Press any key to close");
Console.ReadKey();
}
private static async Task Process(IProgressBar progressBar)
{
using (var chil = progressBar.Spawn(TicksPerProcess, "Child Progress Bar"))
{
for (var i = 0; i < TicksPerProcess; i++)
{
progressBar.Tick();
chil.Tick();
await Task.Delay(1000);
}
}
}
使用这种方法,我得到了所有子进度条的显示,但是所有进度条都停留在10%上,没有任何更新。好吧,我相信任务正在运行,但是控制台没有更新。
作为测试,我放入了一个for循环来更新子任务之外的主进度条,并且所有这些更新都随着主进度条的闪烁而更新,这对我来说是从子任务进行更新也一样但是,这不符合主要进度条的要点。
using (var pbar = new ProgressBar(NumberOfProcesses * TicksPerProcess, "Main Progress bar"))
{
for (int i = 0; i < NumberOfProcesses; i++)
{
Console.WriteLine($"Process: i");
var task = Process(pbar);
processes.Add(task);
}
for (int i = 0; i < NumberOfProcesses * TicksPerProcess; i++)
{
await Task.Delay(1000);
pbar.Tick();
}
}