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 noDoWork
entã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)
{
}