WPF - ProgressBar 仅更新直到过程完成

WPF - ProgressBar Updates only until the process is done

我正在尝试使用 ProgressBar,这对我来说是新的(只能异步吗?)

我按照WPF-Tutorial,遇到没问题。我只是把代码放在这里为了商品。

public partial class ProgressBarTaskOnWorkerThread : Window
{
    public ProgressBarTaskOnWorkerThread()
    {
        InitializeComponent();
    }

    private void Window_ContentRendered(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;

        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i = 0; i < 100; i++)
        {
            (sender as BackgroundWorker).ReportProgress(i);
            Thread.Sleep(100);
        }
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbStatus.Value = e.ProgressPercentage;
    }
}

所以我就把那个代码拿来用了,没有问题。 现在,我试图在我的代码中使用它,并且只是修改了 worker_DoWork 函数,如下所示:

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        while (this.ValueProgress < 100)
        {
            (sender as BackgroundWorker).ReportProgress(this.valueProgress);
            Thread.Sleep(200);
        }
    }

在我的代码中,我导入了一个文件列表,所以我将 this.ValueProgress 设置为 0,然后每次导入文件时,我都会执行 this.ValueProgress=100*NumberImportedFiles / TotalFiles;

我还注意到,在调试中,我的 worker_ProgressChanged 函数在导入时不工作(但 worker_DoWork 工作正常)。然后只有当所有文件都被导入时,worker_ProgressChanged 才会启动多次(似乎它只是一次触发所有已经完成的更改)。

编辑:刚刚做了另一个 "stupid" 测试:

我保留了原始代码,添加了一个条件,所以 ProgressBar 将在我编辑 ValueProgress 后开始移动:

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 100; i++)
    {
        if(this.ValueProgress==0)
        {
            i--;
        }
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);
    }
}

而且那个代码也没有工作,我的意思是,函数 worker_DoWork 工作正常,我在进程开始后开始递增,但是 ProgressBar 没有移动(worker_ProgressChanged 不是射击)。

我没有发表评论的名誉,所以我发布了一个答案。如果我的一些假设是错误的,我提前道歉。您在哪里设置 ValueProgress 的值?如果您在 UI 线程上设置 ValueProgress 的值而不是使用后台工作,那么您可能会阻止 UI 线程。

如果是这样,那么进度条的任何更新都不会显示。尝试在后台工作程序中进行任何更新以保持 UI 可以自由更新。

这里是link教程,可以帮助解决问题

您可以尝试在主线程上更新 ProgressBar。

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Application.Current.Dispatcher.Invoke(() => pbStatus.Value = e.ProgressPercentage);
}

问题是无法在另一个线程上更新 UI。只有主线程可以。