BackgroundWorker para ler o banco de dados e atualizar a GUI

Estou tentando manter minha indeterminadaProgressBar animação funcionando sem problemas enquanto eu consulta o banco de dados e atualizaDataGrid noDoWork noBackgroundWorker. Entendo que não posso atualizar o UIThread noDoWorkentão eu usoDispatcher.BeginInvoke acessarDataGrid, ainda recebo a exceção de propriedade de outro segmento.

Questão 1

Por que isso está acontecendo? O DoWork deve estar no thread do BackgroundWorker, de propriedade da UIThread, e o Dispatcher deve permitir que o DoWork acesse minha GUI.

Analisando mais detalhadamente o BackgroundWorker, sugerimos que a operação da interface do usuário seja tratadaProgressChanged(). Mas se eu mover todas as operações de banco de dados / GUI paraProgressChanged() e colocar umThread.Sleep(5000) emDoWork() emular algo em que trabalhar para dar tempo suficiente paraProgressChanged() para executar, a GUI não está sendo atualizada, embora oProgressBar continue sua animação suave indeterminada.

Questão 2

Eu chamei um Thread.Sleep (5000) no thread BackgroundWorker. ProgressChanged () deve gastar 5 segundos consultando o banco de dados e atualizando a GUI. Por que não?

XAML:

<DataGrid x:Name="myDataGrid" ScrollViewer.CanContentScroll="True" 
          EnableRowVirtualization="True" EnableColumnVirtualization="True"
          VirtualizingPanel.IsContainerVirtualizable="True" 
          VirtualizingPanel.IsVirtualizing="True"
          VirtualizingPanel.IsVirtualizingWhenGrouping="True"
          Height="500" MaxHeight="500" />

<ProgressBar x:Name="myProgressBar" Height="20" Width="400"
             IsIndeterminate="True" Visibility="Visible" />

<Button x:Name="mySearch" Click="btnSearch_Click">Search</Button>

C #

private BackgroundWorker bgw = new BackgroundWorker();

private void btnSearch_Click(object sendoer, RoutedEventArgs e)
{
    bgw.WorkerReportsProgress = true;
    bgw.ProgressChanged += ProgressChanged;
    bgw.DoWork += DoWork;
    bgw.RunWorkerCompleted += BGW_RunWorkerCompleted;

    bgw.RunWorkerAsync();
}

private void DoWork(object sender, DoWorkEventArgs e)
{
    // Thread.Sleep(5000);
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM " + MyTableName, conn))
        {
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    Dispatcher.BeginInvoke(new Action(() =>
                    {
                        myDataGrid.Items.Add(new
                        {
                            Id = rdr.GetInt32(0),
                            Name = rdr.GetString(1).ToString(),
                        });
                    }));
                }
            }
        }
    }
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   // Paste code from DoWork and uncomment Thread.Sleep(5000)
}

private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}

questionAnswers(1)

yourAnswerToTheQuestion