![](/img/trans.png)
[英]Slow insert performance with large amounts of data (SQL Server / C#)
[英]WPF controls performance issues with large amounts of data
我寫了一個日期控件,用於顯示按月布局的可變范圍的天數。 這些日期旨在顯示AM,PM或整天的雙字母代碼,並可將其背景設置為特定顏色,例如:
為了讓天數均勻分布並匹配日期數列,我使用了Stackpanel中包含的UniformGrid:
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
<ItemsControl Name="cal" ItemsSource="{Binding Days}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="13" Columns="32" Margin="0,0,1,5" Width="1158" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:ucYearViewDay/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
這些日子都是用戶控件(這意味着INotifyPropertyChanged
)我設計了支持顯示AM,PM或全天代碼。 然后將日期添加到日期控件綁定的ObservableCollection中。
問題
所有上述設置工作都是從構造函數中的調用完成的,當調用Form.Show()
時,渲染表單大約需要10-12秒。
研究
我花了一點時間閱讀我能做些什么來加快速度,但我似乎無法找到任何幫助。 我試過設置ItemsControl的利用虛擬化的,如建議這個帖子但是這並沒有區別-因為我明白我只得到性能提升這樣,如果我用了大量的滾動和我控制不滾動。 MSDN上有關於提高WPF性能的指南 ,我一直在研究,特別是關於數據綁定的部分,但我找不到任何有用的東西。
基於我所說的,我還有其他技術可以加快速度嗎? 我想我可以取消綁定並直接寫入控件但這將是最后的手段。
VirtualizingStackPanel.IsVirtualizing =“True”僅在將ItemPanel設置為VirtualizingStackPanel時才有效。 您可以通過編寫自己的Virtualized uniformGrid來提高性能。 請參閱以下鏈接,了解如何制作虛擬化平鋪面板。 以同樣的方式,您可以編寫自己的面板,這將提高性能。
http://blogs.msdn.com/dancre/archive/2006/02/06/implementing-a-virtualized-panel-in-wpf-avalon.aspx
基於@Erno de Weerd關於使用一些性能工具的建議,我在尋找有關VS2012中可用的性能工具的這篇文章時,我使用了'Analyze'菜單中的'Performance Analysis'選項並讓跟蹤運行。
結果對我來說非常令人驚訝。 雖然在“功能最多的個人工作”列表中加載了日歷,但它們並沒有真正脫穎而出。 一直在占用的是我通過Task.Factory.StartNew()
啟動的一段代碼,它啟動了一個NamedPipeServerStream
:
接口使用此代碼檢查到應用程序另一部分的傳入消息。 雖然我沒有注意到它減慢了應用程序的速度,但是當應用程序忙於與WPF相關的任務時,它似乎反應很糟糕。 刪除此代碼意味着日歷控件在不到兩秒的時間內加載。 我將很快重寫有問題的代碼。
所以,經驗教訓: 使用性能工具 。 感謝所有的評論,幫助和建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.