首页 > 解决方案 > ProgressChanged 不更新进度条

问题描述

我对 ProcessChanged 有疑问。它在代码中被触发(当我在调试器中查看时),但它不会在进度条所在的主屏幕中更新。

BackgroundWorker的初始化

private void Import_Click(object sender, RoutedEventArgs e)
    {
        progressbarImport.Value = 0;

        int max = DatagridZegrisWeekImport.Items.Count;

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.WorkerReportsProgress = true;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.RunWorkerAsync();
    }

工作

void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        var manager = new ZegrisReadToDB();

        int progressPercentage = 0;
        int max = DatagridZegrisWeekImport.Items.Count;

        for (int i = 0; i < max; i++)
        {
            this.Dispatcher.Invoke(() =>
            {
                DatagridZegrisWeekImport.SelectedIndex = i;
                var selecteditem = DatagridZegrisWeekImport.SelectedItem as ZegrisWeekDataImport;
                string exist = manager.CheckExist2(selecteditem.Artikelnummer, selecteditem.Jaar);
                if (exist == "")
                {
                    insert statement;

                    progressPercentage = Convert.ToInt32(((double)i / max) * 100);
                    (sender as BackgroundWorker).ReportProgress(progressPercentage);
                    Thread.Sleep(100);
                }
                else
                {
                    update statement

                    progressPercentage = Convert.ToInt32(((double)i / max) * 100);
                    (sender as BackgroundWorker).ReportProgress(progressPercentage);
                    Thread.Sleep(100);
                }
            });
        }
    }

进步改变

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

如您所见,我已经尝试了在这个论坛上找到的几个解决方案,但似乎都没有奏效。这是我第一次使用 BackgroundWorker 并且在某个地方我失去了思路。

标签: wpfmultithreadingbackgroundworker

解决方案


如果您打算使用,请BackgroundWorker尝试以下代码

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        var manager = new ZegrisReadToDB();

        int progressPercentage = 0;

        // use the source list if you have it available, rather than casting here
        List<ZegrisWeekDataImport> items = DatagridZegrisWeekImport.Items.Cast<ZegrisWeekDataImport>().ToList();
        var max = items.Count;

        for (int i = 0; i < max; i++)
        {                    
            var item = items[i];

            string exist = manager.CheckExist2(item.Artikelnummer, item.Jaar);

            if (exist == "")
            {
                insert statement;

                progressPercentage = Convert.ToInt32(((double)i / max) * 100);
                (sender as BackgroundWorker).ReportProgress(progressPercentage);
            }
            else
            {
                update statement

                progressPercentage = Convert.ToInt32(((double)i / max) * 100);
                (sender as BackgroundWorker).ReportProgress(progressPercentage);                       
            }
        }
    }

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

如果您可以控制您的ZegrisReadToDB课程,那么如果可以的话,将其设为异步将是有益的。下面是一个使用 async/await 的版本

    // bind you progress bar to this
    public double Progress { get; set; } // raise property changed

    // bind your datagrid to this property
    public List<ZegrisWeekDataImport> Items {get;set;} = new List<ZegrisWeekDataImport>();

    private async void Import_Click(object sender, RoutedEventArgs e)
    {
        await DoWork();
    }

    public async Task DoWork()
    {
        for (int i = 0; i < Items.Count; i++)
        {
            var item = Items[i];

            string exist = await manager.CheckExist2(item.Artikelnummer, item.Jaar);

            if (exist == "")
            {
                await insert statement
            }
            else
            {
                await update statement
            }

            Progress = (double)i / max) * 100; 
        }
    }

推荐阅读