为许多方法编程进度条的最佳方法

时间:2012-08-14 19:29:33

标签: c# progress-bar

说我有一个按钮:btnExecute

此按钮执行所有这些方法:

doAction1();
doAction2();
doAction3();
doAction4();

这些行动中的每一项都需要几秒钟。

如果运行这些方法,我将如何更新进度条?

我知道我可以进入每一个,只是添加pbExecuteProgress.value = 10,但我觉得必须有更好的方法来做到这一点。

我也不想做这样的事情:

doAction1();
pbExecuteProgress.value = 30
doAction2();
pbExecuteProgress.value = 60
doAction3();
pbExecuteProgress.value = 80
doAction4();
pbExecuteProgress.value = 100

有没有办法创建一个进度条,其值达到100并且是=方法的进度?

3 个答案:

答案 0 :(得分:4)

当你“嵌套”进度时,外部方法必须估计每个子程序执行所需的时间,并在子程序中将其除以100%。

您可以随意执行此操作,即方法一为40%,方法二为25%等,或者您可以执行“干运行”以确定每种方法的工作量。例如,如果每个方法处理大量文件,则干运行将计算文件而不实际处理它们,然后您可以使用每个方法的文件计数来分配每个方法的进度条范围。 / p>

干运行方法可以提供更准确的结果,但是所需的预处理可能需要相当长的时间,从而使整体任务变慢。

一旦你有了每个子程序的范围,你就可以传递它们的起始和结束百分比,并且它们可以适当地推进进度。

处理此问题的一种巧妙方法是创建一个处理所有子任务缩放的进度管理器类,这样可以轻松嵌套整个调用子树,并只传递一个对象来处理进度显示。 / p>

答案 1 :(得分:4)

var actions = new List<Action> {doAction1, doAction2, doAction3, doAction4};

foreach(var action in actions)
{
   action();
   progressBar.Value += (progressBar.Maximum - progressBar.Minimum) / actions.Count;
}

如果您想自定义进度值:

var actions = new Dictionary<Action, int> 
{
     {doAction1, 30}, 
     {doAction2, 30}, 
     {doAction3, 20}, 
     {doAction4, 20},
};

progressBar.Minimum = 0;
progressBar.Maximum = actions.Select(kvp=>kvp.Value).Sum();
progressBar.Value = 0;
foreach(var action in actions)
{
   action.Key();
   progressBar.Value += action.Value;
}

声明和创建动作集合不一定要在循环之前发生。实际上,这种模式(战略模式的一种形式)的优势在于,新的动作可以来自任何地方,无论是在当前课程还是在课堂内。

答案 2 :(得分:0)

如果你真的想自己做,我建议计算每个方法中的每个语句以及整个方法,将所有时间都抛到一个数组中,将它们转换为百分比,然后编写em到文本文件或其他东西。冲洗并重复,平均起来,然后你必须添加一堆pbExecuteProgress.value = X语句。我知道你说过你不想这样做,但至少这样才能真正准确地反映这一进展。

只是一个想法。

另外,我很确定有第三方工具会为你做这种事情。但是,它们本身不可能像上述方法那样准确。