ProgressChanged не обновляет индикатор выполнения - PullRequest
0 голосов
/ 16 июня 2020

У меня проблема с 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();
    }

The DoWork

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

The ProgressChanged

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

Как видите, я уже пробовал несколько решений, найденных на этом форуме, но, похоже, ни одно из них не работает. Я впервые использую BackgroundWorker, и где-то я потерял ход мыслей.

1 Ответ

2 голосов
/ 17 июня 2020

Если вы намерены использовать 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 классом, было бы полезно сделать это asyn c, если вы жестяная банка. Ниже представлена ​​версия, в которой используется 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; 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...