Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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应用程序仍然在单个线程中绘制?_C#_Wpf_Multithreading_Performance - Fatal编程技术网

C# 多线程、多调度程序WPF应用程序仍然在单个线程中绘制?

C# 多线程、多调度程序WPF应用程序仍然在单个线程中绘制?,c#,wpf,multithreading,performance,C#,Wpf,Multithreading,Performance,我有一个WPF&C应用程序,它包含一个大的数据网格,大约35列x 50行,用来监视一系列频繁变化的值。问题是,当整个网格可见时,刷新它会将用户界面挂起几乎一秒钟。我每两秒钟就显式刷新一次,这对我正在做的事情来说很好,但是让UI的其余部分挂断是一件非常痛苦的事情 好的,我决定在一个单独的窗口中,在一个单独的线程中,用一个单独的调度程序运行UI的其余部分。我编写了一个玩具窗口,其中只包含一个文本块,其计数递增,使用Dispatchermer每秒更新10次。但是,计数不是平稳递增的,而是在网格刷新时暂

我有一个WPF&C应用程序,它包含一个大的数据网格,大约35列x 50行,用来监视一系列频繁变化的值。问题是,当整个网格可见时,刷新它会将用户界面挂起几乎一秒钟。我每两秒钟就显式刷新一次,这对我正在做的事情来说很好,但是让UI的其余部分挂断是一件非常痛苦的事情

好的,我决定在一个单独的窗口中,在一个单独的线程中,用一个单独的调度程序运行UI的其余部分。我编写了一个玩具窗口,其中只包含一个文本块,其计数递增,使用Dispatchermer每秒更新10次。但是,计数不是平稳递增的,而是在网格刷新时暂停,然后恢复显示,计数比暂停时高出约10,因此计时器事件得到处理。我只是看不到一点新鲜感

WPF是否只在一个线程中绘制其所有元素?有办法吗

这是我的第二个窗口创建代码:

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。