ProgressChanged 不更新进度条

ProgressChanged not updating progressbar

我对 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);
    }

如您所见,我已经尝试了在该论坛上找到的几个解决方案,但 none 似乎行得通。 这是我第一次使用 BackgroundWorker,在某个地方我失去了思路。

如果您打算使用 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 class,那么如果可以的话,将此异步化将是有益的。下面是一个使用 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; 
        }
    }