进度条无法完成

时间:2014-01-14 09:49:51

标签: c# wpf multithreading

我有一个工人和一个进度条。进度条位于视图中,工作者位于模型中。 我想向用户显示进度条,以便他们知道他们需要等待多长时间。所有结果都可以完成填充。

工作线程看起来像这样

模型

ManagementObjectSearcher MetaClasses = new ManagementObjectSearcher(CurrentScope, new SelectQuery("SELECT * FROM meta_class"));
int index = 0;
int Total = MetaClasses.Get().Count;
foreach (ManagementObject Metaclass in MetaClasses.Get())
{
    try
    {
        index++;
        BGW.ReportProgress((index * 100) / Total, Metaclass["__CLASS"].ToString());
    }
    catch { }
    Thread.Sleep(100);
}

工作人员将信息发送到ProgressUpdated方法,我这样做了,因此UI更新了最终用户的可用数据。

模型

public void Workers_Changed(object sender, ProgressChangedEventArgs e)
{
    Progress = e.ProgressPercentage;
    switch (TaskToRun)
    {
        case "NameSpace":
            {
                BaseClasses.Add(e.UserState.ToString());
                if (Progress == 100) { Thread.Sleep(200); }
                break;
            }
        case "Class":
            {
                return;
            }
    }
}

再次完美无缺。 我的进度条值也受限制。

XAML

<ProgressBar Height="20" Name="ProgressBar_WMI"
             Value="{Binding Progress,Mode=OneWay}"
             DockPanel.Dock="Top"
             Minimum="1"
             Maximum="100" Foreground="Red"  ValueChanged="ProgressBar_WMI_ValueChanged" />

问题当进度条达到约95%时,它在UI线程中未显示为已完成

查看(Xaml.CS)

public void HideProgressBar()
{
    Thread.Sleep(3000);
    ProgressBar_WMI.Visibility = Visibility.Collapsed;
}

public void ProgressBar_WMI_ValueChanged(object sender, RoutedEventArgs e)
{
    if (ProgressBar_WMI.Value == ProgressBar_WMI.Maximum)
    {
        ProgressBar_WMI.Foreground = Brushes.Green;
        HideProgressBar();
    }
    else {
        ProgressBar_WMI.Foreground = Brushes.Red;
        ProgressBar_WMI.Visibility = Visibility.Visible;
    }
}

我的想法是让酒吧达到100%完成并转为绿色表示已完成并且在3秒后消失/崩溃。

任何想法?

1 个答案:

答案 0 :(得分:0)

我可以看到ProgressBar未达到100%的两个可能原因。第一个原因很简单,因为你可能会在它到达那一点时隐藏它,所以,你永远不会实际看到它。

其他可能的原因是此计算从不达到最大限制值:

BGW.ReportProgress((index * 100) / Total, Metaclass["__CLASS"].ToString());

只有您可以验证,但可能在实际计算中失去一些精确度,方法是使用int s ...我意识到ReportProgress方法需要int