この質問を検索しましたが、何百万ものエントリを含むテーブルをロードしている質問しか見つかりませんでした。これは私の状況には当てはまりません。
私はWPFとEntity Frameworkを初めて使用しています。Visual Studio 2010 データ ソース ウィザードを使用して、データベースへの接続を追加しました。ドラッグ アンド ドロップを使用して、ビューをデータ ソースから WPF ウィンドウにドラッグしました。ビューには約 32,000 レコードしか含まれておらず、選択に約 15 秒かかります。
初めてアプリケーションをビルドして実行したとき、正常に動作し、ウィンドウにデータが表示されました。違いを感じるために、ListView と Datagrid の両方に同じデータを表示しますが、コントロールの 1 つだけを使用しても違いはありません。
アプリケーションを 2 回目に実行すると、起動が完了しません。「ビジー」カーソルを表示するだけで、しばらくすると OutOfMemoryException がスローされます。タスク マネージャーでパフォーマンスを監視すると、例外が発生するまでメモリが増え続けます。
私はこれをデバッグしました: EF クエリの実行時には発生しません。クエリ結果をリストに保存し、それをウィンドウのデータソースに割り当てることさえしました。デバッガーで、クエリが終了し、リストが正常に生成されていることを確認できます。デバッガーで検査できます。
何もないようにメモリをリークしてスローするように見えるのは、クエリが実行された後のデータ バインディング メカニズムです。ちなみに、投稿できるコールスタックはありません。
他の誰かがこの問題を抱えていましたか?どのように解決しましたか?
ここにいくつかの詳細情報があります: Windows 7 です。
MainWindow.xaml は次のようになります。
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:my="clr-namespace:WpfApplication2">
<Window.Resources>
<CollectionViewSource x:Key="vMyViewSource" d:DesignSource="{d:DesignInstance my:VMyView, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource vMyViewSource}">
<Grid.RowDefinitions>
<RowDefinition Height="20"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="20"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Text="my view in a ListView:"/>
<ListView Grid.Row="1"
ItemsSource="{Binding}"
Margin="0"
Name="vMyListView"
SelectionMode="Single">
<ListView.ItemContainerStyle>
<Style>
<Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
<Setter Property="Control.VerticalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn x:Name="IDColumn1" Header="ID" Width="80">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Margin="6,-1,-6,-1" Text="{Binding Path=ID,Mode=OneWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn x:Name="Name" Header="Name" Width="80">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Margin="-6,-1" Text="{Binding Path=Name, Mode=OneWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
... (more GridViewColumns)
</GridView>
</ListView.View>
</ListView>
<TextBlock Grid.Row="2" Text="my view in a DataGrid:"/>
<DataGrid Grid.Row="3"
AutoGenerateColumns="False"
EnableRowVirtualization="True"
HorizontalAlignment="Left"
ItemsSource="{Binding}"
Margin="0"
Name="vMyViewDataGrid"
RowDetailsVisibilityMode="VisibleWhenSelected"
VerticalAlignment="Top" >
<DataGrid.Columns>
<DataGridTextColumn x:Name="IDColumn" Binding="{Binding Path=ID}" Header="ID" Width="SizeToHeader" />
<DataGridTextColumn x:Name="NameColumn" Binding="{Binding Path=Name}" Header="Name" Width="SizeToHeader" />
... (more DataGridTextColumns, also some with a CellTemplate with a TextBox inside)
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
そして、これは MainWindow の Window_Loaded メソッドです (このコードのほとんどは、データ ソース ウィザードによって自動生成されました)。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WpfApplication2.MyEntities MyEntities = new WpfApplication2.MyEntities();
// Load data into VMyView. You can modify this code as needed.
System.Windows.Data.CollectionViewSource VMyViewViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("vMyViewViewSource")));
System.Data.Objects.ObjectQuery<WpfApplication2.VMyView> VMyViewQuery = this.GetVMyViewQuery(MyEntities);
var data = VMyViewQuery.Execute(System.Data.Objects.MergeOption.AppendOnly).ToList(); // I added the ToList() to make the query execute here
VMyViewViewSource.Source = data;
} // it gets here fine and loads the data
ここに何か異常があるとは信じられません。何が起こっているのでしょうか。どうすればこの問題を解決できますか?