Окна C # формируют индикатор выполнения с фоновым рабочим - PullRequest
0 голосов
/ 18 июля 2011

Я пытаюсь добавить индикатор выполнения в мою надстройку c # excel. Индикатор выполнения появляется, но не показывает никакого прогресса до завершения выполнения функции.

Это функции в классе Windows Form:

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {

            Thread.Sleep(100);

            backgroundWorker1.ReportProgress(i); //run in back thread


        }

    }



    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) //call back method
    {

        progressBar1.Value = e.ProgressPercentage;

    }

    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) //call back method
    {

        progressBar1.Value = progressBar1.Maximum;

    }

Вот как я вызываю функцию с помощью кнопки добавления:

    private void buttonClicked(object sender, RibbonControlEventArgs e)
    {
        AddInPlanView.Form1 pBar = new AddInPlanView.Form1();

        pBar.Visible = true;

        pBar.backgroundWorker1.WorkerReportsProgress = true;

        pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged);

        pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork);

        pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted);

        pBar.backgroundWorker1.RunWorkerAsync();

        FUNCTIONTORUN();

        pBar.Visible = false;

    }

Как мне изменить это, чтобы индикатор выполнения не переставал работать во время выполнения FUNCTIONTORUN ()? Индикатор выполнения инициализируется с помощью дизайнера Visual Studio. Имя объекта ProgressBar в классе формы - ProgressBar1.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

Событие DoWork для вашего индикатора выполнения должно быть (или содержать) FUNCTIONTORUN().FUNCTIONTORUN() следует использовать метод ReportProgress.

2 голосов
/ 18 июля 2011

Что делает FUNCTIONTORUN? Скорее всего, он блокирует поток пользовательского интерфейса, поэтому ваши обновления индикатора выполнения не будут видны, пока он не вернется. Скорее всего, FUNCTIONTORUN необходимо запустить в фоновом режиме и периодически сообщать о прогрессе, и именно здесь вы будете обновлять индикатор выполнения.

0 голосов
/ 18 июля 2011

Я хотел бы остановиться на следующем утверждении.Мэтт Грир может исправить меня, если я ошибаюсь.

Что делает FUNCTIONTORUN?Скорее всего, он блокирует поток пользовательского интерфейса, поэтому ваши обновления индикатора выполнения не будут видны, пока он не вернется.Скорее всего, FUNCTIONTORUN необходимо запустить в фоновом режиме и периодически сообщать о прогрессе, и именно здесь вы будете обновлять индикатор выполнения.

Что я думаю, он подразумевает под этим - вамдля обновления progressBar1.Value в FUNCTIONTORUN (); вы все равно можете использовать аналогичный метод.

...