Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更新WPF StatusBar TextBlock.text以显示后台任务加载数据表的进度_C#_Wpf_Multithreading_Task_Dispatcher - Fatal编程技术网

C# 如何更新WPF StatusBar TextBlock.text以显示后台任务加载数据表的进度

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)

我有一个应用程序,它为用户提供了从表列表中选择要查看的SQL表的选项。我实例化了第二个wpf窗口,该窗口在网格中呈现表的字段。但是,对于较大的表,我想更新StatusBar TextBlock,以显示数据表异步填充时的行数。我试图通过监视dataTable.Count属性来实现这一点,因为dataTable是由任务加载的

我从这个事件处理程序实例化第二个窗口

    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.";
    }