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);