wpf中实时更新进度条
Making a progress bar update in real time in wpf
我在让进度条实时显示更新时遇到了一些问题。
这是我现在的代码
for (int i = 0; i < 100; i++)
{
progressbar1.Value = i;
Thread.Sleep(100);
}
但由于某种原因,函数运行时进度条显示为空,然后直到函数完成才显示任何内容运行。有人可以向我解释如何做到这一点吗?我是 C#/WPF 的新手,所以我不是 100% 确定我将如何在不同的线程上实现 Dispatcher(如在其他一些帖子中看到的那样)来解决这个问题。
澄清一下,我的程序有一个按钮,当按下该按钮时,它会从文本框中获取值,并使用 API 检索信息,并基于它创建标签。我希望进度条在每一行数据处理完成后更新。
这是我现在拥有的:
private async void search(object sender, RoutedEventArgs e)
{
var progress = new Progress<int>(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<int>)progress).Report(i);
}
}));
});
}
谢谢!
您应该使用 .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。
如果您使用的是 .NET 4.5 或更高版本,您可以使用 async/await:
var progress = new Progress<int>(value => progressBar.Value = value);
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
((IProgress<int>)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);
我在让进度条实时显示更新时遇到了一些问题。
这是我现在的代码
for (int i = 0; i < 100; i++)
{
progressbar1.Value = i;
Thread.Sleep(100);
}
但由于某种原因,函数运行时进度条显示为空,然后直到函数完成才显示任何内容运行。有人可以向我解释如何做到这一点吗?我是 C#/WPF 的新手,所以我不是 100% 确定我将如何在不同的线程上实现 Dispatcher(如在其他一些帖子中看到的那样)来解决这个问题。
澄清一下,我的程序有一个按钮,当按下该按钮时,它会从文本框中获取值,并使用 API 检索信息,并基于它创建标签。我希望进度条在每一行数据处理完成后更新。
这是我现在拥有的:
private async void search(object sender, RoutedEventArgs e)
{
var progress = new Progress<int>(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<int>)progress).Report(i);
}
}));
});
}
谢谢!
您应该使用 .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。
如果您使用的是 .NET 4.5 或更高版本,您可以使用 async/await:
var progress = new Progress<int>(value => progressBar.Value = value);
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
((IProgress<int>)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);