Обновить индикатор выполнения для каждого найденного элемента - PullRequest
0 голосов
/ 25 октября 2018

У меня проблема с моей прогрессбаром и циклами (на C #).Мне нужно проанализировать коллекцию элементов (через цикл foreach), и для каждого найденного объекта мне нужно увеличить индикатор выполнения (через цикл for) ... Но мой код выполняется для каждого найденного объекта, что это нормально,но я не могу найти обходной путь ...

Вот мой упрощенный код:

int totalSteps = lv_selection.Items.Count;

        foreach (string p in lv_selection.Items)
        {
            for (int i = 0; i < totalSteps; i++)
            {
                // A time consuming job
                (sender as BackgroundWorker).ReportProgress((int)(100 / totalSteps) * i, null);

                // Update the progressbar's text (located in another form)
                this.Dispatcher.Invoke(() =>
                {
                    progressbarForm.Progress(p);
                });
            }
        }

Прогресс прогресса, как и ожидалось, но для каждого элемента в моей коллекции (переменная "p"),Я понимаю почему, но я не знаю, как это исправить.

Также попытался поменять местами циклы for и foreach.И установите цикл for после "трудоемкой работы".

Кто-нибудь может мне помочь, пожалуйста?

Спасибо большое.

1 Ответ

0 голосов
/ 25 октября 2018

Я наконец получил это!:)

Я попытался использовать трюк, и он отлично работает.

Я создаю целочисленную переменную перед foreach, устанавливая в 0. Внутри foreach я увеличиваю эту переменную на единицу,и пошлите его значение в мой индикатор прогресса как шаг.

    private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {

        int totalSteps = lv_selection.Items.Count;
        int currentStep = 0;

        // Installations
        foreach (string p in lv_selection.Items)
        {
            currentStep++;

            // My long task 

            this.Dispatcher.Invoke(() =>
            {
                progressbarForm.Progress(p);
            });

            (sender as BackgroundWorker).ReportProgress((int)(100 / totalSteps) * currentStep, null);

            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...