C# 如何更新WPF StatusBar TextBlock.text以显示后台任务加载数据表的进度
我有一个应用程序,它为用户提供了从表列表中选择要查看的SQL表的选项。我实例化了第二个wpf窗口,该窗口在网格中呈现表的字段。但是,对于较大的表,我想更新StatusBar TextBlock,以显示数据表异步填充时的行数。我试图通过监视dataTable.Count属性来实现这一点,因为dataTable是由任务加载的 我从这个事件处理程序实例化第二个窗口C# 如何更新WPF StatusBar TextBlock.text以显示后台任务加载数据表的进度,c#,wpf,multithreading,task,dispatcher,C#,Wpf,Multithreading,Task,Dispatcher,我有一个应用程序,它为用户提供了从表列表中选择要查看的SQL表的选项。我实例化了第二个wpf窗口,该窗口在网格中呈现表的字段。但是,对于较大的表,我想更新StatusBar TextBlock,以显示数据表异步填充时的行数。我试图通过监视dataTable.Count属性来实现这一点,因为dataTable是由任务加载的 我从这个事件处理程序实例化第二个窗口 private void OnItem_DoubleClick(object sender, RoutedEventArgs e)
private void OnItem_DoubleClick(object sender, RoutedEventArgs e)
{
var selected = DataViewsListBox.SelectedItem.ToString();
var tableLoadWindowThread = new Thread(() =>
{
var tableWindow = new TableWindow();
tableWindow.Show();
tableWindow.LoadDataView(selected);
System.Windows.Threading.Dispatcher.Run();
});
tableLoadWindowThread.SetApartmentState(ApartmentState.STA);
tableLoadWindowThread.IsBackground = true;
tableLoadWindowThread.Start();
}
我使用以下代码在第二个窗口中加载网格。我还试图用while循环期间添加的数据表行数更新StatusBar TextBlock.Text字段--
第二个窗口呈现,它被阻止,并且StatusText.Text字段未更新。调试器显示while循环正在按预期更新StatusText.Text字段。该窗口不呈现填充的网格或StatusBar/TextBlock、Dispatcher.Run()语句
在wpf应用程序的上下文之外,异步监视datatable负载的方法工作得很好。我希望她能就wpf的线程、任务、分派器模型如何工作提供一些指导,以便修复此代码。谢谢 删除所有这些并使用适当的数据绑定。是的,我的风格可能有点弱,这是我的第一个wpf程序…有关如何在多线程场景中正确使用wpf功能的详细说明,请参阅。将绑定移动到xaml中。简化了代码,但仍无法更新状态文本,因为数据正在加载到datatable中。
public void LoadDataView(string dataView)
{
var dataTable = new DataTable();
var t = Task.Factory.StartNew(() =>
{
using (var adapter = new SqlDataAdapter(@"select * from " + dataView, @"conn string"))
{
adapter.Fill(dataTable);
}
});
while (!t.IsCompleted)
{
if (!StatusText.Dispatcher.CheckAccess())
{
StatusText.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal,
new Action(delegate() { StatusText.Text = "Loading data source, row count = " + dataTable.Rows.Count; }));
}
else
{
StatusText.Text = "Loading data source, row count = " + dataTable.Rows.Count;
}
}
TableGridView.ItemsSource = dataTable.AsEnumerable().ToList();
StatusText.Text = dataTable.Rows.Count + " data source rows loaded.";
}