【发布时间】:2014-01-14 09:49:50
【问题描述】:
我有一个工人和一个进度条。进度条在视图中,工作人员在模型中。 我想向用户显示进度条,以便他们知道需要等待多长时间。以完成所有结果的填充。
工作线程是这样的
型号
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 秒后消失/折叠。
有什么想法吗?
【问题讨论】:
-
使用 Dispatcher.BeginInvoke 异步调用 HideProgressBar。这将使窗口有机会重绘自身,以便在进度条在filal状态下绘制时执行
Thread.Sleep(3000)。Dispatcher.BeginInvoke(new Action(() => HideProgressBar())); -
我假设您谈论的是在公共 void ProgressBar_WMI_ValueChanged(object sender, RoutedEventArgs e) 方法中使用 Dispatcher,我已经更新了代码,但仍然遇到问题。
标签: c# wpf multithreading