C#中的进度监视器实现

时间:2009-03-30 11:50:59

标签: c# .net progress-bar

在Eclipse中,我看到了一个IProgressMonitor的实现 - 后来也在SharpDevelop中,但我不确定它是如何工作的。在其他地方是否有一个例子可能更容易理解?

我想要实现的是通过一个进度条跟踪一堆任务(从20分钟到5秒变化很大)的进度的方法(可以在任何时间点添加任务)。

这样的事情会是一个很好的选择/想法吗?

interface ITask
{
    int TotalWork; // ProgressMax
    event Progresschanged; // Notifies of the current progress
    event ProgressComplete;
}

然后“监视器”只使用观察者模式来监视这两个事件。当所有进度条都完成后,它将隐藏进度条。另一个问题是这些是正在产生的单独线程。

有人能告诉我什么或引导我走上正轨吗?

2 个答案:

答案 0 :(得分:2)

维护一份任务清单并按其总体贡献加权;

struct Task { int work, progress  }
class OverallProgress
{
    List<Task> tasks;
    int Work { get { return tasks.Sum(t=>t.work; } }
    int Progress { get { return tasks.Sum(t=>t.progress/t.work); } }
    void AddTask(Task t) { tasks.Add(t); }
}

此实现仅用于说明概念

是的,这种实施效率不高。您可以存储计算出的Work,以便仅在添加新任务时重新计算它。

是的,通过进行整数除法可能会失去精度。 你也必须连接你自己的活动。

如果您在完成这些任务时遇到问题,请提及,我或其他人可以提供此类课程的完整实施。

答案 1 :(得分:1)

System.Component.BackgroundWorker处理进度通知。我会产生多个BG工作者并让他们在UI线程上向单个方法报告。然后,您可以更新进度条。