ProgressChanged未更新进度条

问题描述 投票:-1回答:1

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

ProgressChanged

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

您可能会看到,我已经尝试了在该论坛上找到的几种解决方案,但是似乎都没有用。这是我第一次使用BackgroundWorker,在某个地方我迷失了思路。

wpf multithreading backgroundworker
1个回答
0
投票

如果您打算使用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类,则可以使该异步是有益的。以下是使用异步/等待的版本

    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; 
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.