在wpf中实时更新进度条
我在进度条实时显示更新时遇到了一些麻烦。
这是我现在的代码
for (int i = 0; i < 100; i++) { progressbar1.Value = i; Thread.Sleep(100); }
但由于某种原因,当函数运行时进度条显示为空,然后在函数完成运行之前没有任何内容。 有人可以向我解释如何做到这一点? 我是C#/ WPF的新手,所以我不能100%确定如何在不同的线程上实现Dispatcher(如其他一些post所示)来解决这个问题。
为了澄清,我的程序有一个按钮,按下时,从文本框中获取值,并使用API检索信息,并根据它创建标签。 我希望在每行数据处理完毕后更新进度条。
这就是我现在所拥有的:
private async void search(object sender, RoutedEventArgs e) { var progress = new Progress(value => progressbar1.Value = value); await Task.Run(() => { this.Dispatcher.Invoke((Action)(() => { some pre-processing before the actual for loop occur for (int i = 0; i < numberofRows; i++) { label creation + adding ((IProgress)progress).Report(i); } })); }); }
谢谢!
如果您使用的是.NET 4.5或更高版本,则可以使用async / await :
var progress = new Progress(value => progressBar.Value = value); await Task.Run(() => { for (int i = 0; i < 100; i++) { ((IProgress )progress).Report(i); Thread.Sleep(100); } });
您需要使用async
关键字标记您的方法才能使用await
,例如:
private async void Button_Click(object sender, RoutedEventArgs e)
管理使其工作。 我所需要的只是做而不是做到这一点
progressBar1.value = i;
我只是必须这样做
progressbar1.Dispatcher.Invoke(() => progressbar1.Value = i, DispatcherPriority.Background);
您应该使用.NET中包含的BackgroundWorker ,它为您提供了报告事件中后台线程进度的方法。 创建BackGroundWorker的线程会自动调用此事件。
BackgroundWorker.ProgressChanged可用于向用户报告异步操作的进度。
// This event handler updates the progress bar. private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.progressBar1.Value = e.ProgressPercentage; }
有关使用此信息的详细信息,请参阅MSDN。