首页 > 解决方案 > 任务中的 ShellProgressBar 子进度条

问题描述

如何更新异步任务中的主进度条和子进度条?

我正在使用在这里找到的 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% 并且没有任何更新。好吧,我相信任务正在运行,但控制台没有更新。

控制台卡在 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();
    }
}

进度条更新

标签: c#.net-coreconsole-application

解决方案


推荐阅读