Индикатор выполнения С#

У меня есть индикатор выполнения, чтобы показать статус загрузки программы в библиотеку.

    foreach (Song s in InitializeLibrary())
    {
        Library.AddSong(s);
        pBar.Value++;
        pBar.Update();
    }

InitializeLibrary() — это просто функция, которая возвращает список.

Проблема в том, что индикатор выполнения перестает «двигаться» после определенного момента (например, 20%), в то время как значение все еще увеличивается. Есть ли способ заставить его обновляться 100% времени?


person Mike    schedule 08.11.2009    source источник
comment
Что вы используете для пользовательского интерфейса (Windows Forms, WPF)?   -  person oltman    schedule 08.11.2009
comment
индикатор выполнения по умолчанию в Visual C# 2008.   -  person Mike    schedule 08.11.2009
comment
Вы установили pBar.Maximum = numberOfItemsInTheList?   -  person Darin Dimitrov    schedule 08.11.2009


Ответы (2)


Я сделал это с помощью компонента BackgroundWorker.

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

Фоновый рабочий обрабатывает весь обмен сообщениями между потоками для отчетов о ходе выполнения.

Это дает вам преимущества многопоточности без необходимости самостоятельно управлять потоками.

здесь есть хороший учебник, который покажет, как использовать отчеты о ходе выполнения.

person jasonmw    schedule 08.11.2009
comment
со мной случалось, что, когда приложение выполняет много работы в потоке пользовательского интерфейса, иногда экран не перерисовывается часто и возникает ощущение зависания. если разделить работу на другую нить, то покраска экрана не проблема. - person jasonmw; 08.11.2009

Вам необходимо установить Максимум свойство индикатора выполнения, чтобы он мог рассчитывать проценты при увеличении Значение:

var items = InitializeLibrary();
pBar.Maximum = items.Length;
foreach (Song s in items)
{
    Library.AddSong(s);
    pBar.Value++;
}
person Darin Dimitrov    schedule 08.11.2009