C# 跨不同流程(循环)“分支”进度
客观的 我正在尝试建立一个支持分支的进度跟踪机制 摘要 这里的主要概念是,在每个阶段,我都知道当前的索引和步骤数,直到这个阶段完成 示例场景 假设这些项目是连续运行的,则进度百分比如下所示:C# 跨不同流程(循环)“分支”进度,c#,branch,progress,C#,Branch,Progress,客观的 我正在尝试建立一个支持分支的进度跟踪机制 摘要 这里的主要概念是,在每个阶段,我都知道当前的索引和步骤数,直到这个阶段完成 示例场景 假设这些项目是连续运行的,则进度百分比如下所示: 0% 10% 20% 30% 40% 50% 50% 75% 100% 100% 提问时间 首先,我所做的事情的正确术语是什么?因此,我无法正确搜索 第二,我所做的数学是什么?我必须跟踪哪些变量 最终产品 我希望最终的界面如下所示: class Ta
0%
10%
20%
30%
40%
50%
50%
75%
100%
100%
提问时间
首先,我所做的事情的正确术语是什么?因此,我无法正确搜索
第二,我所做的数学是什么?我必须跟踪哪些变量
最终产品
我希望最终的界面如下所示:
class TaskManagerExample
{
void Execute(Task[] tasks)
{
var pm = new ProgressManager(); // <- this class does the magic
// v-- and this is how the magic is used :)
pm.ProgressChanged += (object sender, EventArgs e) =>
{
progressBar1.Value = (sender as ProgressManager).TotalProgress;
};
pm.SetTotal(tasks.Length);
foreach (var task in tasks)
{
task.Execute(pm.Branch());
pm.NextStep();
}
}
}
class Task
{
protected int SubTasks = 0;
public Task(int subTasks){ this.SubTasks = subTasks; }
public void Execute(ProgressManager pmb)
{
pmb.SetTotal(this.SubTasks);
for(int i = 0; i < this.SubTasks; i++)
{
// do something
pmb.NextStep();
}
}
}
我的问题是ProgressManager的实现。我已经能够实现父子关系,所以Branch和NextStep都可以。我对TotalProgress应该如何实施感到困惑。
如何遍历该树来计算正确的进度位置?您是否能够向任务中添加另一个属性,该属性需要估计工作量,并使用聚合的工作量得出百分比估计值?否,原因如下:1。我目前的使用方式无法使用它。2.将这些信息保存在负责It进度的类中比保存在任务中更干净。3.为了使分支更清晰、更明显。任务不应该知道向谁报告其进度,您应该实现进度查看,然后在任务管理器中处理事件。任务管理器可以跟踪当前步骤以及当前正在运行的任务的0到100%的进度。任务管理器也可以实现进度,计算很简单,当前进度=当前步骤*当前步骤进度/步骤数。@RonBeyer我同意你所说的,除了一部分……我有子任务。单个任务必须像TaskManager一样工作。顶级任务管理器不知道子任务。我需要一个可以在任何级别处理这种关系的实现。子任务可以以相同的方式计算进度,方法是使用其子任务的进度来计算和更新自己的进度。不过,在这一点上,任务管理器几乎与任务完全相同,因此您真正需要的只是任务类。。。
class TaskManagerExample
{
void Execute(Task[] tasks)
{
var pm = new ProgressManager(); // <- this class does the magic
// v-- and this is how the magic is used :)
pm.ProgressChanged += (object sender, EventArgs e) =>
{
progressBar1.Value = (sender as ProgressManager).TotalProgress;
};
pm.SetTotal(tasks.Length);
foreach (var task in tasks)
{
task.Execute(pm.Branch());
pm.NextStep();
}
}
}
class Task
{
protected int SubTasks = 0;
public Task(int subTasks){ this.SubTasks = subTasks; }
public void Execute(ProgressManager pmb)
{
pmb.SetTotal(this.SubTasks);
for(int i = 0; i < this.SubTasks; i++)
{
// do something
pmb.NextStep();
}
}
}