【发布时间】:2014-04-30 02:23:23
【问题描述】:
我的 WPF 应用程序中有一个简单的数据绑定元素列表,我试图从中获得更多性能。在下面的代码中,我添加了一百万条记录并表示我的项目列表发生了变化。
我有以下 XAML:
<Window x:Class="Log_.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Log+ Viewer" Height="400" Width="500">
<Grid Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TabControl>
<TabItem Header="Everything">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListView ItemsSource="{Binding LogRecords}">
<ListView.View>
<GridView>
<GridViewColumn Header="Message" DisplayMemberBinding="{Binding Message}"/>
<GridViewColumn Header="Timestamp" DisplayMemberBinding="{Binding Timestamp}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>
</TabItem>
</TabControl>
</Grid>
</Window>
这是 C# 代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace Log_
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ObservableList<LogRecord> LogRecords { get; set; }
public MainWindow()
{
InitializeComponent();
LogRecords = new ObservableList<LogRecord>();
DataContext = this;
new Thread(() =>
{
LogRecord record = new LogRecord();
record.Message = "Hello, world.";
record.Timestamp = DateTime.Now;
List<LogRecord> logRecordList = new List<LogRecord>();
for (int i = 0; i < 1000000; i++)
{
logRecordList.Add(record);
}
Stopwatch timer = new Stopwatch();
timer.Start();
Dispatcher.Invoke(() =>
{
LogRecords.AddRange(logRecordList);
});
timer.Stop();
Console.WriteLine("The operation took {0} milliseconds.", timer.ElapsedMilliseconds);
}).Start();
}
public class LogRecord
{
public string Message { get; set; }
public DateTime Timestamp { get; set; }
}
public class ObservableList<T> : IEnumerable<T>, INotifyCollectionChanged
{
public List<T> UnderlyingList = new List<T>();
public event NotifyCollectionChangedEventHandler CollectionChanged;
public void AddRange(IEnumerable<T> list)
{
UnderlyingList.AddRange(list);
OnCollectionChange(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, UnderlyingList));
}
protected virtual void OnCollectionChange(NotifyCollectionChangedEventArgs e)
{
if (CollectionChanged != null)
{
CollectionChanged(this, e);
}
}
public IEnumerator<T> GetEnumerator()
{
return UnderlyingList.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return UnderlyingList.GetEnumerator();
}
}
}
}
输出是:“操作耗时 4834 毫秒。”
将这些记录添加为一系列记录似乎是一个荒谬的时间。我在这里打破 UI 虚拟化是因为我的项目源像这样继承 IEnumerable 还是这是正常的性能?我怎样才能让这段代码运行得比现在快得多?
【问题讨论】:
标签: c# .net wpf performance listview