【发布时间】:2017-06-07 06:33:37
【问题描述】:
我有一段代码测试 GUI 和线程行为。我想在查询数据库并将大量行 (10K+) 添加到 DataGrid 时保持 ProgressBar animation 运行(使用IsIndeterminate="True")。即使我将数据库和 GUI 代码包装在 Dispatcher.BeginInvoke 中,ProgressBar animation 也会随着 DataGrid 的填充而抖动。
我希望 ProgressBar 动画 会冻结(如果在 GUI 线程上)或平稳运行(如果在单独的线程上),但我不明白为什么动画会突然运行。
请不要建议 BackgroundWorker,因为我想了解这个问题中的问题,以及为什么 BeginInvoke 没有分离线程。我只是循环遍历 SqlDataReader 并作为 Item 一项一项添加到 DataGrid,而不是将数据绑定到源或数据表。
// XAML
<Button Click="Button_Click"></Button>
<ProgressBar IsIndeterminate="True"></ProgressBar>
<DataGrid ... ></DataGrid>
// C#
private void Button_Click(object sendoer, RoutedEventArgs e)
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,(ThreadStart)delegate()
{
// Query database and update GUI (e.g. DataGrid)
});
}
【问题讨论】:
-
进度条动画在 UI 线程上运行。 WinRT 能够在不同的线程上运行动画,但不幸的是,这对于 WPF 仍然不可用。想知道它为什么会跑得快,你是如何将数据绑定到 DataGrid 的?
-
我只是简单地遍历 SqlDataReader 并作为 Item 一项一项地添加到 DataGrid,而不是将数据绑定到源或数据表。
-
在您的代码示例中,您都在 UI 线程上工作(使用 BeginInvoke),那么为什么会顺利呢?
-
也许我弄错了——但对我来说很明显,在调度程序线程上运行东西会导致 UI 变为
jerk。你不能在 Dispatcher-Thread 中查询和更新你的Databaseasync 吗?
标签: c# wpf multithreading dispatcher