Регулярно сообщайте о прогрессе BackgroundWorker - PullRequest
1 голос
/ 24 декабря 2011

Я пишу музыкальный проигрыватель. Это (ранний) код, который добавляет каталог в список воспроизведения:

    private void SelectFolderButton_Click(object sender, EventArgs e)
    {
        int count = 0;
        AddFolderDialog.ShowDialog();
        if(AddFolderDialog.SelectedPath != string.Empty)
        {
            BackgroundWorker bgw = new BackgroundWorker();
            bgw.DoWork += (a,b) => playlist.AddFolder(AddFolderDialog.SelectedPath, RecursiveCheckBox.Checked, out count);
            bgw.RunWorkerAsync();
            bgw.RunWorkerCompleted += (a, b) => mainStatusLabel.Text = "Added " + count + " songs"; ;
            bgw.RunWorkerCompleted += (a, b) => DrawPlaylist();
        }
    }

Я только начал использовать темы. Первый вопрос: правильный ли это код? Здесь что-то явно не так? Вторая проблема заключается в том, что я хочу регулярно отображать количество добавленных песен по мере их добавления. Не обязательно песня за песней; раз в секунду это хорошо. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2011

Backgroundworker помогает вам поддерживать отзывчивость вашего интерфейса и прост в использовании. Он также заботится о многопоточности.

Фоновый работник также имеет событие ProgressChanged. Рабочий поток может сообщить о прогрессе с помощью метода ReportProgress(int percentProgress). Если вы не знаете процент, это не проблема; просто передайте количество песен, обработанных в качестве параметра. Это ваш обработчик события ProgressChanged, который получает этот номер. Пусть он делает все, что подходит с этим номером. Вызовите событие ProgressChanged после обработки определенного количества песен или по истечении определенного времени. Просто запомните время начала или время последнего изменения прогресса и посмотрите, сколько времени прошло с тех пор. Нет необходимости в таймере или тому подобном.

Обратите внимание, что фундаментальная проблема с многопоточностью заключается в том, что только UI-поток (тот, в котором работает код вашего основного приложения) может взаимодействовать с формами и элементами управления. Backgroundworker автоматически вызывает обработчики событий RunWorkerCompleted и ProgressChanged в потоке пользовательского интерфейса.

0 голосов
/ 24 декабря 2011

Проверьте эту SO тему. Я ответил, что для другого пользователя с комментариями. Обновить индикатор выполнения в MainWindow из другого потока

По сути, вам не хватает WorkerReportsProgress = true в фоновом режиме, а также при обработке события ProgressChanged . Кроме того, поместите RunWorkerAsync после того, как вы установите все свои события.

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

...