C# 进度条将不会完成

C# 进度条将不会完成,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个工人和一个进度条。进度条在视图中,辅助对象在模型中。 我想向用户显示进度条,以便他们知道需要等待多长时间。使所有结果完成填充 工作线程看起来像这样 模型 worker将信息发送到ProgressUpdated方法,我这样做是为了使用最终用户的可用数据更新UI 模型 再次完美地工作。 我的进度条值也是绑定的 XAML 我的想法是让酒吧打到100%完成,并变成绿色,以表明其已完成和消失/崩溃后3秒 有什么想法吗?我可以看出进度条未达到100%的两个可能原因。第一个原因很简单,因为当它到达那个

我有一个工人和一个进度条。进度条在视图中,辅助对象在模型中。 我想向用户显示进度条,以便他们知道需要等待多长时间。使所有结果完成填充

工作线程看起来像这样

模型

worker将信息发送到ProgressUpdated方法,我这样做是为了使用最终用户的可用数据更新UI

模型

再次完美地工作。 我的进度条值也是绑定的

XAML

我的想法是让酒吧打到100%完成,并变成绿色,以表明其已完成和消失/崩溃后3秒


有什么想法吗?

我可以看出进度条未达到100%的两个可能原因。第一个原因很简单,因为当它到达那个点时,你可能会把它藏起来,因此,你永远不会真正看到它

另一个可能的原因是,此计算从未达到您的最大极限值:

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

只有您可以验证这一点,但在实际计算中使用ints可能会损失一些精度。。。我知道ReportProgress方法使用Dispatcher.BeginInvoke异步调用HideProgressBar。这将使窗口有机会重新绘制自身,以便在filal状态下绘制进度条时执行Thread.Sleep3000。Dispatcher.BeginInvokenew操作=>HideProgressBar;我假设您正在谈论在public void ProgressBar_WMI_ValueChangedobject sender RoutedEventTarget方法中使用Dispatcher,我已经更新了代码,但仍然遇到问题。如果ProgressBar_WMI.Value==ProgressBar_WMI.Maximum,我指示在达到最大值之前不执行所述操作。使用断点表示该值=最大值。
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;
            }
    }
}
<ProgressBar Height="20" Name="ProgressBar_WMI"
             Value="{Binding Progress,Mode=OneWay}"
             DockPanel.Dock="Top"
             Minimum="1"
             Maximum="100" Foreground="Red"  ValueChanged="ProgressBar_WMI_ValueChanged" />
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;
    }
}
BGW.ReportProgress((index * 100) / Total, Metaclass["__CLASS"].ToString());