Fazer uma atualização da barra de progresso em tempo real no wpf

Estou a ter problemas em fazer com que a barra de progresso mostre as actualizações em tempo real.

Este é o meu código neste momento.
for (int i = 0; i < 100; i++)
{
     progressbar1.Value = i;
     Thread.Sleep(100);
}

mas por alguma razão a barra de progresso mostra vazia quando a função corre, e então nada até que a função termine de executar. Alguém me pode explicar como isto pode ser feito? Eu sou novo A C# / WPF assim que eu não sou 100% certo em como eu implementaria um Dispatcher em um tópico diferente (como visto em alguns outros posts) para corrigir este problema.

para clarificar, meu programa tem um botão que quando pressiona, pega o valor de uma caixa de texto, e usa uma API para recuperar informações, e criar etiquetas com base nele. Eu quero que a barra de progresso para atualizar após cada linha de dados está terminado o processamento.

Isto é o que tenho agora.
private async void search(object sender, RoutedEventArgs e)
{
    var progress = new Progress<int>(value => progressbar1.Value = value);
    await Task.Run(() =>
    {
        this.Dispatcher.Invoke((Action)(() =>
        {
             some pre-processing before the actual for loop occur
             for (int i = 0; i < numberofRows; i++)
             {
                  label creation + adding
                  ((IProgress<int>)progress).Report(i);
             }
        }));
    });
}
Obrigado!

Author: nonion, 2015-04-26

3 answers

Se estiver a utilizar. net 4. 5 ou mais tarde, pode utilizar async / await:

var progress = new Progress<int>(value => progressBar.Value = value);
await Task.Run(() =>
{
    for (int i = 0; i < 100; i++)
    {
        ((IProgress<int>)progress).Report(i);
        Thread.Sleep(100);
    }
});

Tem de marcar o seu método com async palavra-chave para poder usar await, por exemplo:

private async void Button_Click(object sender, RoutedEventArgs e)
 20
Author: Aleksey Shubin, 2015-04-26 02:09:30
Consegui que resultasse. Tudo o que eu precisava fazer era em vez de fazer apenas
progressBar1.value = i;
Só tinha de o fazer.
progressbar1.Dispatcher.Invoke(() => progressbar1.Value = i, DispatcherPriority.Background);
 16
Author: nonion, 2015-04-26 09:10:31

Você deve usar BackgroundWorker incluído no. NET, que lhe oferece métodos para relatar o progresso de um tópico de fundo num evento. O tópico que criou o BackGroundWorker automaticamente chama este evento.

O Trabalhador Clandestino.O ProgressChanged pode ser utilizado para comunicar ao utilizador o progresso de uma operação assíncrona.

// This event handler updates the progress bar. 
private void backgroundWorker1_ProgressChanged(object sender,
    ProgressChangedEventArgs e)
{
    this.progressBar1.Value = e.ProgressPercentage;
}

Consulte O MSDN para mais informações sobre a utilização deste.

 4
Author: Saagar Elias Jacky, 2015-04-26 01:44:21