Индикатор выполнения в фоновом режиме не загружается - PullRequest
0 голосов
/ 21 февраля 2012

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

У меня есть вторая форма небольшого размера, установленная по центру на экране с установленным в Marquee стилем ProgressBar, в этой второй форме больше ничего нет, поскольку она предназначена для эмуляции строки загрузки.

В моей части кода, интенсивно использующей данные, в основной форме, где он собирает и анализирует данные из базы данных, я написал это так:

 GetData()
 {
      bwLoading.RunWorkerAsync();
      //Runs all the processing
      bwLoading.CancelAsync();
 }

Фоновый работник определен как таковой ниже, также в основной форме.

 private void bwLoading_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        frmLoading lb = new frmLoading();
        bool running = true;
        while (running)
        {
            if ((worker.CancellationPending == true))
            {
                lb.Close();
                running = false;
            }
            else
            {
                lb.Show();
            }
        }

    }

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

Разве фоновый работник не создает отдельный поток для использования в форме загрузки? Или я что-то упускаю из своего чтения?

1 Ответ

3 голосов
/ 21 февраля 2012

Вы должны фактически сообщить о ходе вашей фоновой операции, используя ReportProgress(). Для этого вам необходимо знать, сколько процентов вашей работы вы выполнили.

Если вы не сообщите о прогрессе, индикатор выполнения всегда будет оставаться на уровне 0%, пока ваша фоновая операция не будет завершена, а затем исчезнет - это то, что вы наблюдаете.

Edit:

В свете вашего комментария - вы используете индикатор прогресса стиля маркировки - я думаю, что проблема здесь:

 GetData()
 {
      bwLoading.RunWorkerAsync();
      //Runs all the processing
      bwLoading.CancelAsync();
 }

Я подозреваю, что вы выполняете метод GetData() из потока пользовательского интерфейса - это означает, что поток пользовательского интерфейса заблокирован, и индикатор выполнения не может быть обновлен. Переместите всю свою обработку в метод bwLoading_DoWork, чтобы она выполнялась в отдельном потоке, а не в потоке пользовательского интерфейса - тогда ваш индикатор выполнения должен обновляться. Также удалите вызов bwLoading.CancelAsync() - он будет использоваться только для отмены.

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