任务中的ShellProgressBar子进度条

时间:2018-06-20 21:39:33

标签: c# .net-core console-application

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

我正在使用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%上,没有任何更新。好吧,我相信任务正在运行,但是控制台没有更新。

Console stuck at 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();
    }
}

Progress bars updating

0 个答案:

没有答案