C# 多线程、多调度程序WPF应用程序仍然在单个线程中绘制?
我有一个WPF&C应用程序,它包含一个大的数据网格,大约35列x 50行,用来监视一系列频繁变化的值。问题是,当整个网格可见时,刷新它会将用户界面挂起几乎一秒钟。我每两秒钟就显式刷新一次,这对我正在做的事情来说很好,但是让UI的其余部分挂断是一件非常痛苦的事情 好的,我决定在一个单独的窗口中,在一个单独的线程中,用一个单独的调度程序运行UI的其余部分。我编写了一个玩具窗口,其中只包含一个文本块,其计数递增,使用Dispatchermer每秒更新10次。但是,计数不是平稳递增的,而是在网格刷新时暂停,然后恢复显示,计数比暂停时高出约10,因此计时器事件得到处理。我只是看不到一点新鲜感 WPF是否只在一个线程中绘制其所有元素?有办法吗 这是我的第二个窗口创建代码:C# 多线程、多调度程序WPF应用程序仍然在单个线程中绘制?,c#,wpf,multithreading,performance,C#,Wpf,Multithreading,Performance,我有一个WPF&C应用程序,它包含一个大的数据网格,大约35列x 50行,用来监视一系列频繁变化的值。问题是,当整个网格可见时,刷新它会将用户界面挂起几乎一秒钟。我每两秒钟就显式刷新一次,这对我正在做的事情来说很好,但是让UI的其余部分挂断是一件非常痛苦的事情 好的,我决定在一个单独的窗口中,在一个单独的线程中,用一个单独的调度程序运行UI的其余部分。我编写了一个玩具窗口,其中只包含一个文本块,其计数递增,使用Dispatchermer每秒更新10次。但是,计数不是平稳递增的,而是在网格刷新时暂
private void Window_Loaded( object sender, RoutedEventArgs e )
{
ThreadStart ts = new ThreadStart( RunSpareThread );
m_spare_thread = new Thread( ts );
m_spare_thread.IsBackground = true;
m_spare_thread.Priority = ThreadPriority.Highest;
m_spare_thread.SetApartmentState( ApartmentState.STA );
m_spare_thread.Start();
Dispatcher.Thread.Priority = ThreadPriority.Lowest;
}
void RunSpareThread()
{
m_spare_window = new SpareWindow();
m_spare_window.Show();
Dispatcher.Run();
}
仅供参考,我尝试了几种不同的方法来实现网格-作为列表视图,作为覆盖OnRender并绘制一大堆GlyphRunDrawings的画布-WPF在绘制这些东西时速度非常慢。不幸的是,是的。也就是说,您可以做很多事情来提高ui的响应能力。其中一个主要问题是确保在UI线程中完成的工作量最少。这意味着在单独的上下文中执行所有DB读取等操作。您还应该了解网格是如何显示您的价值观的——它是虚拟化的吗?然后是数据绑定的方式,bindingsource应该只允许您在所有更改完成后更新绑定。不幸的是,是的。也就是说,您可以做很多事情来提高ui的响应能力。其中一个主要问题是确保在UI线程中完成的工作量最少。这意味着在单独的上下文中执行所有DB读取等操作。您还应该了解网格是如何显示您的价值观的——它是虚拟化的吗?还有就是数据绑定的方式,bindingsource应该只允许您在所有更改完成后更新绑定。WPF非常快,如果您正确使用它 一些提示: 根据要显示的数据的MVVM实现模型或ViewModel。确保它实现INotifyPropertyChanged接口。将这些模型的集合绑定到DataGrid; 不要每N秒刷新一次所有数据。您应该以某种方式使用工作线程检测数据更改,并在适当的模型上更新适当的属性。由于数据绑定,所有更改将自动反映在DataGrid上。所以,您甚至不需要使用Dispatcher,至少不需要显式地使用; 如果不需要对数据进行编辑、排序、筛选等特殊操作,请使用ListView而不是DataGrid。; 如果需要显示大量的行,请考虑实现A。
如果使用得当,WPF的速度非常快 一些提示: 根据要显示的数据的MVVM实现模型或ViewModel。确保它实现INotifyPropertyChanged接口。将这些模型的集合绑定到DataGrid; 不要每N秒刷新一次所有数据。您应该以某种方式使用工作线程检测数据更改,并在适当的模型上更新适当的属性。由于数据绑定,所有更改将自动反映在DataGrid上。所以,您甚至不需要使用Dispatcher,至少不需要显式地使用; 如果不需要对数据进行编辑、排序、筛选等特殊操作,请使用ListView而不是DataGrid。; 如果需要显示大量的行,请考虑实现A。