c# - 任务中的 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% 并且没有任何更新。好吧,我相信任务正在运行,但控制台没有更新。
作为测试,我投入了一个 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();
}
}
解决方案
推荐阅读
- javascript - 函数的第一次执行总是比第二次慢吗?
- javascript - 过滤json数组上的特定值并创建另一个数组
- django - 无法使用 Python 3.8 在 Windows 10 上安装“psycopg2”
- google-apps-script - 是否可以使用谷歌表格设置带有自动插入值的注释?
- mongodb - 通过从数据库中获取增量数据来触发 Airflow ETL 作业
- java - 有什么方法可以测试 Spring Transactions 传播
- php - 如何将数组转换为特定的 Json 格式
- azure - 在 azure 虚拟机上托管多个网站
- linux - 分区空闲空间的排序输出
- php - T-Mobile 和 Sprint 上的 Twilio SMS 发送问题